MongoDB如何将没有属性的文档与空查询进行匹配


How does MongoDB match a document without a property with a null query

我有用户控制器,我用条件编写了以下查找查询

$userData = $this->User->find('first', array('conditions'=>array('id'=>null)));

如果我用id=null条件编写find查询,那么它也会返回数据库中的第一条记录。

我本以为没有任何记录because条件为假,但它写了第一条记录。

我的问题是为什么记录是从数据库返回的,这背后的逻辑是什么?

生成MongoDB查询

db.users.find( {"id":null}, [] ).sort( [] ).limit( 1 ).skip( 0 ).hint( [] );

更新

若我用有效的user_id编写以下查询,那个么它将返回记录。

$userData = $this->User->find('first', array('conditions'=>array('id'=>"54c72b984a1bfeb420324670")));

要给出解释,您需要考虑这里实际发生了什么。以这些文档为例:

{ "b": "a" },
{ "b": "a", "c": "d" }

如果你基本上形成这样的查询:

db.collection.find({ "c": "d" })

然后,您可以按预期获得第二个文档。

{ "b": "a", "c": "d" }

但是,如果您在同一字段上查询null

db.collection.find({ "c": null })

你得到的第一个文件回应:

{ "b": "a" },

原因是条件"为真"。文档中没有字段,因此MongoDB会考虑对null值进行任何测试,以证明该字段不存在。如果字段确实存在,但不包含值null,则它将不符合该条件,并且不会返回。

因此,当您要求文档中不存在的字段的值时,内部评估是字段"值"实际上是null

首先,索引需要稀疏,才能包含NULL值。看见http://docs.mongodb.org/manual/core/index-sparse/#index-类型稀疏

然后,您生成的查询需要查找BSON类型10,即仅为NULL,而不是NULL。

例如:

db.users.find( { id : { $type: 10 } }, []).sort([]).limit(1).skip(0).hint [] )

如果没有这些设置,您的查询将正确查找第一条NULL或非NULL记录。