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”。在这两个领域中,我遇到了一些麻烦来执行这些行为。有人能帮助我吗?
有你看着使用['$ filter'(https://docs.mongodb.com/manual/reference/operator/aggregation/filter/#exp._S_filter)? – JohnnyHK