Mongo查询根据其他文档状态的状态信息查找单个文档

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 } 

如果没有状态为“开始”的文档,我需要find一个状态为“新”的文档

请注意,如果当前时间和updated_at差异小于1小时,我们需要考虑状态为“已启动”的doc

有什么办法吗?

试试这个

  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} ] ); 

说明
第一条stream水线:如果任何具有给定条件的文档匹配,则$ redact将保留当前文档/embedded式文档级别的所有字段,而不进一步检查这些字段。 否则所有文件都被修剪。
第二条stream水线:在返回的所有文档中,只匹配新的状态。
第三条stream水线:将结果限制为1

或者,您也可以尝试分两步进行操作。
步骤1:检查是否存在具有$ cond以上的文档
步骤2:然后find一个具有新状态的文档