arrays - MongoDB 未正确查询给定位置数组内的 `null`

标签 arrays mongodb mongodb-query mongo-shell

在处理查询中的空值和数组索引时,我很难理解为什么在 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-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 为 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 中处理数组和空值的错误吗?

最佳答案

问题是即使您意味着 db.test.find({"a.2": null})基于index of 2 is null 这不是它的实际含义。它的意思是要么 2 的索引为空,要么对象的字段名称2 为空。在数组查询中,我们访问数组(所以说 a:2 应该匹配值 2 但也匹配任何包含元素 2 的数组。这里匹配器陷入“我正在匹配子字段 2 但这是一个数组,因此我应该检查数组的每个元素以查看它是否是字段名称 2,值 null

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

关于arrays - MongoDB 未正确查询给定位置数组内的 `null`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41170768/

相关文章:

node.js - 我可以动态地将索引添加到 Mongoose 中的架构中吗?

php - mongodb聚合框架按两个字段分组

python - Mongodb DeprecationWarning : count is deprecated. 使用 Collection.count_documents 代替

c++ - '{' 标记错误之前的预期主表达式

c# - 不区分大小写如何下单

node.js - mongo错误: Topology was destroyed

javascript - meteor mongodb _id 在插入后发生变化(以及 UUID 属性)

c - 段错误(在kali中使用gcc)

arrays - 迭代数组中的元素,除了前两个之外,还使用 ​​ "each_slice"

.net - IDisposable : Method 'X' has multiple definitions with identical signatures