【问题标题】:MongoDB find Documents where all array elements equal some valueMongoDB查找所有数组元素都等于某个值的文档
【发布时间】:2017-09-21 12:30:51
【问题描述】:

收藏:

db.test.find()
{
  { "_id" : ObjectId(...), "arr" : [ "Today", "is", null ] }
  { "_id" : ObjectId(...), "arr" : [ null, null, null ] }
}

我正在尝试查找所有 arr 等于某个值的所有文档。在这个例子中,当给定null时,我想要包含arr : [null, null, null]的文档。

Find documents where ALL elements of an array have a specific value

这个解决方案接近我想要的;但是,我的数组数据没有供 $elemMatch 引用的键。有没有一种方法可以在不增加不必要的成本或重组我的数据的情况下完成此查询?

谢谢!

【问题讨论】:

标签: mongodb


【解决方案1】:

您可以使用$elemMatch 查询运算符。它只需要一个查询。

 db.test.find( { arr:  { $not: { $elemMatch: { $ne: null } } } } )

"$elemMatch" + "$ne"

这部分包括所有arr数组没有至少一个空值的文档。

这些都是至少有一个非空值的文档。

$not

这部分将保留所有不在"$elemMatch" + "$ne"中的文档。

这些是所有值为null的文档。

请适应不存在字段的边缘情况,以确保事情按预期工作。

【讨论】:

  • 这似乎可行,并在 arr 上添加了存在和大小检查。谢谢!
【解决方案2】:

您可以使用$all 运算符,但语义可能不是您想要的。

db.test.find({ arr: { $all: [null] } })

这将返回您的两个测试文档。

如果你真的想查询一个包含 3 个空值的数组,你可以只查询字面量数组:

db.test.find({arr:[null,null,null]})

【讨论】:

  • 正确,$all 运算符似乎在任何值为null 时返回(包括arr 本身)。不幸的是,不知道一个数组有多少个值,所以我无法构造一个字面量数组进行比较。
  • 这似乎是一个奇怪的要求。也许还有另一种解决方法。您能否分享有关您的用例和示例的更多详细信息?
  • 简单地说,我需要能够过滤数组中具有同质数据的文档。例如,假设 driver1 和 driver2 在 db.drivers 中有以下条目:{_id: "driver1" , record: ["win", "win", "win"]}, {_id: "driver2", record: ["win"]}。鉴于这些数据,我想查询 db.drivers 以获取所有具有完美记录的驱动程序,在这种情况下,这两个驱动程序都会返回。
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多