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
条件编写查找查询,那么它也是 return 来自数据库的第一条记录。
我预计没有任何记录because
条件为假,但它写入了第一条记录。
我的问题是为什么记录 return 来自数据库,其背后的逻辑是什么?
已生成MongoDB查询
db.users.find( {"id":null}, [] ).sort( [] ).limit( 1 ).skip( 0 ).hint( [] );
更新
如果我使用有效 user_id
编写以下查询,那么它会 return 记录。
$userData = $this->User->find('first', array('conditions'=>array('id'=>"54c72b984a1bfeb420324670")));
首先,您的索引需要稀疏以便包含 NULL 值。参见 http://docs.mongodb.org/manual/core/index-sparse/#index-type-sparse
然后您生成的查询需要查找 BSON 类型 10,即仅 NULL,而不是 NULL。
例如:
db.users.find( { id : { $type: 10 } }, []).sort([]).limit(1).skip(0).hint [] )
如果没有这些设置,您的查询将正确找到第一条记录,该记录要么为 NULL,要么不为 NULL。
要给出解释,您需要考虑这里真正发生的事情。以这些文件为例:
{ "b": "a" },
{ "b": "a", "c": "d" }
如果您基本上形成这样的查询:
db.collection.find({ "c": "d" })
然后你得到了预期的第二个文档。
{ "b": "a", "c": "d" }
但是如果您在同一字段上查询 null
:
db.collection.find({ "c": null })
您得到第一个响应文档:
{ "b": "a" },
原因是因为条件"is true"。文档中不存在任何字段,因此 MongoDB 考虑针对 null
值进行任何测试以证明该字段不存在的情况。如果该字段确实存在但不包含 null
的值,那么它将不匹配该条件并且不会被返回。
因此,当您询问文档中不存在的字段值时,内部评估是字段 "value" 实际上是 null
我有用户控制器,我写了以下带条件的查找查询
$userData = $this->User->find('first', array('conditions'=>array('id'=>null)));
如果我用 id=null
条件编写查找查询,那么它也是 return 来自数据库的第一条记录。
我预计没有任何记录because
条件为假,但它写入了第一条记录。
我的问题是为什么记录 return 来自数据库,其背后的逻辑是什么?
已生成MongoDB查询
db.users.find( {"id":null}, [] ).sort( [] ).limit( 1 ).skip( 0 ).hint( [] );
更新
如果我使用有效 user_id
编写以下查询,那么它会 return 记录。
$userData = $this->User->find('first', array('conditions'=>array('id'=>"54c72b984a1bfeb420324670")));
首先,您的索引需要稀疏以便包含 NULL 值。参见 http://docs.mongodb.org/manual/core/index-sparse/#index-type-sparse
然后您生成的查询需要查找 BSON 类型 10,即仅 NULL,而不是 NULL。
例如:
db.users.find( { id : { $type: 10 } }, []).sort([]).limit(1).skip(0).hint [] )
如果没有这些设置,您的查询将正确找到第一条记录,该记录要么为 NULL,要么不为 NULL。
要给出解释,您需要考虑这里真正发生的事情。以这些文件为例:
{ "b": "a" },
{ "b": "a", "c": "d" }
如果您基本上形成这样的查询:
db.collection.find({ "c": "d" })
然后你得到了预期的第二个文档。
{ "b": "a", "c": "d" }
但是如果您在同一字段上查询 null
:
db.collection.find({ "c": null })
您得到第一个响应文档:
{ "b": "a" },
原因是因为条件"is true"。文档中不存在任何字段,因此 MongoDB 考虑针对 null
值进行任何测试以证明该字段不存在的情况。如果该字段确实存在但不包含 null
的值,那么它将不匹配该条件并且不会被返回。
因此,当您询问文档中不存在的字段值时,内部评估是字段 "value" 实际上是 null