Mongo查询根据与其他文档状态相关的状态字段查找单个文档
文档
{
_id:some mongo id,
name : "test one",
status:"new",
created_at:datetime,
updated_at:datetime
}
{
_id:some mongo id,
name : "test two",
status:"new",
created_at:datetime,
updated_at:datetime
}
{
_id:some mongo id,
name : "test one",
status:"started",
created_at:datetime,
updated_at:datetime
}
如果没有状态为“已开始”的文档
,我需要找到一个状态为“新”的文档注意 如果当前时间和时间,我们需要考虑状态为“已启动”的doc。 updated_at差异小于1小时
有什么办法吗?
答案 0 :(得分:1)
试试这个:
db.coll.aggregate(
[
{ $redact: {
$cond: {
if: { $and: [{ $eq: [ { $lte: [ {$divide: [{$subtract: [new Date(), "$updated_at"]}, 3600000]} , 1] }, true]}, { "status": "started" }] },
then: "$$KEEP",
else: "$$PRUNE"
}
}
},
{ $match: { "status": "new" } },
{"$limit":1}
]
);
<强>解释强>:
第一个管道:如果任何具有我们给定条件的文档匹配,则$ redact将所有字段保留在当前文档/嵌入文档级别,而不进一步检查字段。
此外,所有文件都被修剪。
第二个管道:在返回的所有文件中,仅与状态新匹配。
第3条管道:限制结果为1
或者,您也可以尝试分两步完成此操作。
第1步:检查是否存在任何超过$ cond的docuemnt
第2步:然后找到一个具有新状态的文件