我很难理解为什么在询问零件和数组索引时,以下情况发生在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.2
与null
语义相结合将给出您看到的结果。