mongo:查找未取代的文档

时间:2019-05-05 14:54:37

标签: mongodb mongodb-query

我有一个收藏,其中包含以下文件:

{
        "_id" : "ThisIsASampleId_rand12345",
        "timestamp" : ISODate("2019-04-30T10:53:34.515Z"),
        "mySpecialId" : "specialId_12345",
        "status" : "error",
}

我的目标是查找所有带有{status: 'error'}的文档,只要不存在具有相同mySpecialIdstatus 'success'的后续文档即可。

很明显我可以做db.jobs.find({status: 'error'}),但是之后我迷路了。

我是否需要在聚合管道中将$lookup用作同一个集合,同时将"mySpecialId"用作本地字段和外部字段,并且$match包含类似{{1 }}?感觉有点不对。

是否有更简单/更好/更优雅的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以通过timestamp字段$sort来收集文档,然后使用$group运算符运行$last以获取每个mySpecialId的最新文档。然后,您可以简单地检查最后一个文档的status是否为error。如果不是,则该组中所有出现successerror的文档都被success取代。要恢复文档的原始形状,可以使用$replaceRoot

db.col.aggregate([
    {
        $sort: { timestamp: 1 }
    },
    {
        $group: {
            _id: "$mySpecialId",
            lastDoc: { $last: "$$ROOT" }
        }
    },
    {
        $match: {
            "lastDoc.status": "error"
        }
    },
    {
        $replaceRoot: {
            newRoot: "$lastDoc"
        }
    }
])