Mongo查询:$存在NULL值

时间:2015-06-16 08:52:12

标签: mongodb mongoose

我在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值,尽管文档说它应该。

2 个答案:

答案 0 :(得分:6)

来自MongoDB official $exists docs

  

< boolean> 为true时, $ exists 会匹配包含该字段的文档,包括字段值 null 的文档。如果< boolean> 为false,则查询仅返回不包含该字段的文档。

换句话说,$existsnull计为有效值。因此,{"$exists": false}仅匹配相应字段为undefined的文档,而不是null

尝试将您的字段与null匹配:

{
    "lastTopicSearch": null
}

此查询将匹配nullundefined值。

答案 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 } }