mongodb在给定的姿势中未在数组中正确查询“ null”



我很难理解为什么在询问零件和数组索引时,以下情况发生在MongoDB中。

说我们有以下内容:

> db.test.find()
{ "_id" : ObjectId("5852da24507d8c27f4e3c357"), "item" : null }
{ "_id" : ObjectId("5852da2d507d8c27f4e3c358"), "item" : { "something" : true } }
{ "_id" : ObjectId("5852da33507d8c27f4e3c359") }

当我尝试找到null的项目时,我将获得ObjectId("5852da24507d8c27f4e3c357")ObjectId("5852da33507d8c27f4e3c359"),该项目基于https://docs.mongodb.com/v3.2/tutorial/query-for-null-null-fields/p

> db.test.find({"item" : null})
{ "_id" : ObjectId("5852da24507d8c27f4e3c357"), "item" : null }
{ "_id" : ObjectId("5852da33507d8c27f4e3c359") }

但是,当我尝试执行相同的操作,但在带有给定索引的数组中,它是完全不同的结果:

说我们有以下内容:

> db.test.find()
{ "_id" : ObjectId("5852dbe1507d8c27f4e3c35c"), "a" : [ { "something" : true }, { "something" : true }, null ] }
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] }
{ "_id" : ObjectId("5852dbfb507d8c27f4e3c35e"), "a" : [ { "something" : true }, { "something" : true } ] }

但是,如果我基于2的索引进行查询是null的,我们仍然会返回所有文档:

> db.test.find({"a.2": null})
{ "_id" : ObjectId("5852dbe1507d8c27f4e3c35c"), "a" : [ { "something" : true }, { "something" : true }, null ] }
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] }
{ "_id" : ObjectId("5852dbfb507d8c27f4e3c35e"), "a" : [ { "something" : true }, { "something" : true } ] }

对我来说,这似乎并不如预期的那样工作吗?但是,我们可以看到索引位置正常工作,因为我们可以执行以下查询:

> db.test.find({"a.2": {something:true}})
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] }

这是MongoDB中的错误并处理数组和nulls?

问题即使您的均值db.test.find({"a.2": null})query based on the index of 2 is null,这并不是实际的含义。它的含义是 2的索引是null的,或者有一个为null的对象的字段名称2。在数组查询中,我们到达数组(因此,说a:2应该匹配值2,也可以匹配任何具有元素2的数组。在这里,Matcher陷入了"我要匹配Subfield 2,但这是一个数组,因此我应该检查数组的每个元素查看它是否是字段名称2,值null

这是查询语言中不幸的歧义,在某些情况下,响应并不是真正不正确的,并且直到使用语法增强语言,允许您明确指定您的 。位置2或仅用于字段名称2查询a.2null语义相结合将给出您看到的结果。

最新更新