2017-05-08 53 views
0

我有一个蒙戈文件(taskExecution)如下面的一个:MongoDB的:过滤一个阵列中specifc元件在投影

{ 
    "_id" : "46647-1493064966032-0-1", 
    "_class" : "net.afferolab.hub.microservice.model.TaskExecution", 
    "name" : "PEOPLE", 
    "executionDate" : ISODate("2017-04-24T20:32:22.722Z"), 
    "taskInformation" : [ 
     { 
      "status" : "BEGIN", 
      "message" : "Iniciando rota de integração de pessoas", 
      "informationDate" : ISODate("2017-04-24T20:32:22.730Z") 
     }, 
     { 
      "status" : "INFO", 
      "message" : "[ ] - Obtendo arquivo do servidor FTP.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.090Z") 
     }, 
     { 
      "status" : "INFO", 
      "message" : "[X] - Obtendo arquivo do servidor FTP.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.097Z") 
     }, 
     { 
      "status" : "ERROR", 
      "message" : "[ ] - Upload do arquivo para o S3.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.102Z") 
     }, 
     { 
      "status" : "INFO", 
      "message" : "[ ] - Upload do arquivo para o S3.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.107Z"), 
      "fileName" : "lab/PEOPLE/ID-46647-1493064966032-0-1-1493065242667.txt.gz" 
     }, 
     { 
      "status" : "INFO", 
      "message" : "[X] - Upload do arquivo para o S3.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.114Z") 
     }, 
     { 
      "status" : "INFO", 
      "message" : "[ ] - Transformando arquivo em pessoas.", 
      "informationDate" : ISODate("2017-04-24T20:32:23.121Z") 
     } 
    ] 
} 

而且我执行以下查询:

db.taskExecution.aggregate([{ 
     $match: { 
      name: 'BTG-IMPORT-PEOPLE-TO-YOUKNOW', 
      executionDate: { 
       '$gte': ISODate("2017-05-03T00:00:00.000Z"), 
       '$lte': ISODate("2017-05-03T23:59:59.999Z") 
      } 
     } 
    }, 

    { 
     $project: { 
      NAME: "$name", 
      BEG: { $arrayElemAt : [ "$taskInformation.informationDate", 0 ]}, 
      START_DATE: { $arrayElemAt : [ "$taskInformation.informationDate", -1 ]}, 
      DURATION: { $divide : [ { $subtract: [ {$arrayElemAt : [ "$taskInformation.informationDate", -1 ]},{$arrayElemAt : [ "$taskInformation.informationDate", 0 ]}]}, 60000]}, 
      ERRORS: "$taskInformation.message", 
      STATUS: {$cond: [{$eq : ["$taskInformation.status", "ERROR"]}, "ERROR", { $arrayElemAt : [ "$taskInformation.status", -1 ]}]} 
     } 
    } 
]) 

投影中的ERRORS字段必须仅带有taskInformation.status为“ERROR”的元素的taskInformation.message。如果任何taskInformation.status是“ERROR”,则STATUS字段必须返回“ERROR”,否则返回最后一个taskInformation.status,如果没有任何一个是“ERROR”。在这两个领域中,我遇到了一些麻烦来执行这些行为。有人能帮助我吗?

+0

有你看着使用['$ filter'(https://docs.mongodb.com/manual/reference/operator/aggregation/filter/#exp._S_filter)? – JohnnyHK

回答

0

您可以使用以下投影STATUSERROR

STATUS投影使用$anyElementTrue$map检查中taskInformationstatus,如果真实情况是ERROR否则最后一个元素status

STATUS: { 
    $cond: [{ 
     $anyElementTrue: { 
      $map: { 
       input: "$taskInformation", 
       as: "resultm", 
       in: { 
        $eq: ["$$resultm.status", "ERROR"] 
       } 
      } 
     } 
    }, "ERROR", { 
     $arrayElemAt: ["$taskInformation.status", -1] 
    }] 
} 

STATUS投影使用$filter$mapERROR状态和显示过滤taskInformationmessage

ERRORS: { 
    $map: { 
     input: { 
      $filter: { 
       input: "$taskInformation", 
       as: "resultf", 
       cond: { 
        $eq: ["$$resultf.status", "ERROR"] 
       } 
      } 
     }, 
     as: "resultm", 
     in: "$$resultm.message" 
    } 
}