【问题标题】:mongo: find non-superseded documentsmongo:查找未取代的文档
【发布时间】:2019-05-05 14:54:36
【问题描述】:

我有一个包含以下文档的集合:

{
        "_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'}),但在那之后,我就迷路了。

我是否需要在聚合管道中使用"mySpecialId" 作为本地和外部字段,并使用包含{$gt: {timestamp: $PREVIOUS_TIMESTAMP}} 之类的$match 在同一集合中执行$lookup?不知何故,这感觉不对。

有没有更简单/更好/更优雅的方法来做到这一点?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您可以通过timestamp 字段$sort 您的集合,然后使用$last 运算符运行$group 以获取每个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"
            }
        }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多