我有用户控制器,我用条件编写了以下查找查询
$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记录。