Mongo查询根据状态fieds查找单个doc相对于其他docs状态

时间:2017-05-11 06:48:17

标签: node.js mongodb mongoose

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小时

有什么办法吗?

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步:然后找到一个具有新状态的文件