聚合框架-MongoDb对数组中最后一个元素的值进行过滤



以下查询无效。有人能告诉我错误的地方吗?

我正在尝试筛选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"
            }
        }
    }
]

相关内容

  • 没有找到相关文章

最新更新