我在mongodb中挣扎着看似简单的查询。
我有一个job
集合,其中包含以下对象:
{
"_id" : ObjectId("5995c1fc3c2a353a782ee51b"),
"stages" : [
{
"start" : ISODate("2017-02-02T22:06:26Z"),
"end" : ISODate("2017-02-03T22:06:26Z"),
"name" : "stage_one"
},
{
"start" : ISODate("2017-02-03T22:06:26Z"),
"end" : ISODate("2017-02-07T20:34:01Z"),
"name" : "stage_two"
}
]
}
我想找一份第二阶段没有结束时间的工作,即end
为空或未定义。
根据querying for null和querying an array of embedded documents上的mongo文档,似乎正确的查询应该是:
db.job.findOne({'stages.1.end': null})
但是,运行该查询会返回上面 具有非空结束日期的作业。实际上,如果我使用count
而不是findOne
运行查询,我会看到所有作业都被返回 - 根本没有进行过滤。
为了完整性,以下是新mongo实例上的示例的输出:
所以在这个例子中,我希望db.job.findOne({'stages.1.end': null})
不返回任何内容,因为只有一个文档而且它的第二个阶段有一个非空的结束日期。
这就像是一个问题,只是我是一个白痴,如果是这样,我道歉。
预先感谢您的帮助,如果您需要更多详细信息,请与我们联系!
修改
经过一些实验,我认为我可以通过以下方式实现我的目标:
db.job.find({$or: [{'stages.1.end': { $type: 10 }}, {'stages.1.end': {$exists: false}}]})
虽然这可以完成工作,但它并不是最简单的方法,我仍然不理解为什么原始查询不起作用。如果有人能够对此有所了解,那就非常感激。