以下查询无效。有人能告诉我错误的地方吗?
我正在尝试筛选Progress
数组中最后一个项目具有给定状态的所有文档,例如"完成"。
db.logdata.aggregate(
[
{ "$match": { "ProcessingInfo.Progress" : { "$exists": true } } },
{ "$redact":
{
"$cond": {
"if": { "$eq": [ { "$arrayElemAt": [ "$ProcessingInfo.Progress.State", -1 ], "Done" } ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
]
)
样本文档(应该匹配-因为最后一个State in Progress数组是"InProgress">(:
{
"_id" : ObjectId("578fa85bb29339a1fa6d6109"),
"ProcessingInfo" : {
"DateStarted" : ISODate("2016-08-06T16:55:58.294+0000"),
"Attempt" : NumberInt(1),
"LastState" : "Failed",
"Progress" : [
{
"State" : "Failed",
"StateDescription" : ""
},
{
"State" : "Success",
"StateDescription" : ""
},
{
"State" : "Done",
"StateDescription" : ""
},
{
"State" : "InProgress",
"StateDescription" : ""
}
]
}
}
为了"规避"这个问题,我在文档根"LastState"中增加了一个字段——这可能是解决问题的方法吗(从复杂性角度来看(?
您的查询有一个小语法错误:您的"Done"
应该在$eq
数组中,而不是在包含$arrayElemAt
定义的对象中。以下查询(由于Styvane的建议,经过优化以过滤出ProcessInfo.Progress
数组中任何位置都没有预期State
的文档(应该会返回您的示例文档:
[
{ "$match": { "ProcessingInfo.Progress.State" : "InProgress" } },
{ "$redact":
{
"$cond": {
"if": { "$eq": [ { "$arrayElemAt": [ "$ProcessingInfo.Progress.State", -1 ] }, "InProgress" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
]