我有一个收藏,其中包含以下文件:
{
"_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
包含类似{{1 }}?感觉有点不对。
是否有更简单/更好/更优雅的方式来做到这一点?
答案 0 :(得分:1)
您可以通过timestamp
字段$sort来收集文档,然后使用$group运算符运行$last以获取每个mySpecialId
的最新文档。然后,您可以简单地检查最后一个文档的status
是否为error
。如果不是,则该组中所有出现success
或error
的文档都被success
取代。要恢复文档的原始形状,可以使用$replaceRoot。
db.col.aggregate([
{
$sort: { timestamp: 1 }
},
{
$group: {
_id: "$mySpecialId",
lastDoc: { $last: "$$ROOT" }
}
},
{
$match: {
"lastDoc.status": "error"
}
},
{
$replaceRoot: {
newRoot: "$lastDoc"
}
}
])