【发布时间】:2016-12-15 18:14:56
【问题描述】:
我很难理解为什么在 mongodb 中处理查询中的空值和数组索引时会发生以下情况。
假设我们有以下内容:
> db.test.find()
{ "_id" : ObjectId("5852da24507d8c27f4e3c357"), "item" : null }
{ "_id" : ObjectId("5852da2d507d8c27f4e3c358"), "item" : { "something" : true } }
{ "_id" : ObjectId("5852da33507d8c27f4e3c359") }
当我尝试查找为空的项目时,我得到 ObjectId("5852da24507d8c27f4e3c357") 和 ObjectId("5852da33507d8c27f4e3c359"),这与基于 https://docs.mongodb.com/v3.2/tutorial/query-for-null-fields/ 的预期一致
> 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 的索引为空进行查询,我们仍然会返回所有文档:
> 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 中的一个错误并处理数组和空值吗?
【问题讨论】:
-
我不确定这是否是预期的行为,也许是一个错误,所以我创建了JIRA SERVER-27442
标签: arrays mongodb mongodb-query mongo-shell