Mongodb mongo:查找未被取代的文档

Mongodb mongo:查找未被取代的文档,mongodb,mongodb-query,Mongodb,Mongodb Query,我收集了以下文件: { "_id" : "ThisIsASampleId_rand12345", "timestamp" : ISODate("2019-04-30T10:53:34.515Z"), "mySpecialId" : "specialId_12345", "status" : "error", } 我的目标是找到所有具有{status:'error'}的文档,只要没有具有相同mySpecialId和status'su

我收集了以下文件:

{
        "_id" : "ThisIsASampleId_rand12345",
        "timestamp" : ISODate("2019-04-30T10:53:34.515Z"),
        "mySpecialId" : "specialId_12345",
        "status" : "error",
}
我的目标是找到所有具有
{status:'error'}
的文档,只要没有具有相同
mySpecialId
status
'success'
的后续文档存在

显然我可以做
db.jobs.find({status:'error'})
,但在那之后,我就迷路了

我是否需要在聚合管道中对同一个集合执行
$lookup
,使用
“mySpecialId”
作为本地和外部字段,使用
$match
,其中包括类似
{$gt:{timestamp:$PREVIOUS_timestamp}
?不知怎么的,这感觉不对

有更简单/更好/更优雅的方法吗?

您可以通过
时间戳
字段收集,然后与操作员一起运行,以获取每个
mySpecialId
的最新文档。然后,您只需检查最后一个文档的
状态
是否为
错误
。如果没有,则该组中的所有文档都有
success
或出现的
error
被替换为
success
。要恢复文档的原始形状,可以使用

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