我在Mongo集合中有以下对象:
{
"active" : true,
"startDate": Date( 1434355148265 ), // Mon Jun 15 2015 15:59:08 GMT+0800 (HKT)
"endDate": null,
"lastFeedSearch": null,
"lastTopicSearch": null
}
然后我尝试运行以下查询,但它似乎没有返回任何对象
{
"active":true,
"$and":[
{
"$or":[
{
"startDate":{
"$exists": false
}
},
{
"startDate":{
"$lte": "2015-06-16T07:07:30+00:00"
}
}
]
},
{
"$or":[
{
"endDate":{
"$exists": false
}
},
{
"endDate":{
"$gte": "2015-06-16T07:07:30+00:00"
}
}
]
},
{
"$or":[
{
"$or":[
{
"lastTopicSearch":{
"$lte": "2015-06-16T06:07:30+00:00"
}
},
{
"lastTopicSearch":{
"$exists": false
}
}
]
},
{
"$or":[
{
"lastFeedSearch":{
"$lte": "2015-06-16T06:52:30+00:00"
}
},
{
"lastFeedSearch":{
"$exists": false
}
}
]
}
]
}
]
}
据我所知,所有这些$or
条件至少应该匹配。
据我所知,这是因为$exists
似乎没有考虑null
值,尽管文档说它应该。
答案 0 :(得分:6)
来自MongoDB official $exists
docs:
当< boolean> 为true时, $ exists 会匹配包含该字段的文档,包括字段值 null 的文档。如果< boolean> 为false,则查询仅返回不包含该字段的文档。
换句话说,$exists
将null
计为有效值。因此,{"$exists": false}
仅匹配相应字段为undefined
的文档,而不是null
。
尝试将您的字段与null
匹配:
{
"lastTopicSearch": null
}
此查询将匹配null
和undefined
值。
答案 1 :(得分:2)
The documentation of $exists说:
当
<boolean>
为真时,$ exists与包含该字段的文档匹配,包括字段值为null的文档。如果为false,则查询仅返回不包含该字段的文档。
您的所有条件都有$exists:false
。您的文档包含上述字段(值为null
),因此不会返回文档。
很遗憾,您不能{ endDate: null }
,因为这也会匹配字段不存在的文档(除非查询对该字段使用sparse index)。
When your want to find documents where the field is null并且您不想创建稀疏索引,使用{{3}搜索字段 的字段Null
的字段}。
{ endDate : { $type: 10 } }