【问题标题】:Query mongodb array of documents查询mongodb数组的文档
【发布时间】:2019-08-26 21:34:54
【问题描述】:

我有一堆看起来像这样的文档:

{
   "ids": [{"name":"aa", "age":1}, {"name":"bb", "age":2}]
}

我希望能够通过提供一组 id 来查询我的文档,例如

db.getCollection('Collection').find({"ids":{$in : [{"name":"aa", "age":1}, {"name":"bb", "age":2}]}})

通常可以,但是当字段顺序更改时它会中断,例如,当我执行以下查询时找不到文档

db.getCollection('Collection').find({"ids":{$in : [{"age":1,"name":"aa"}, { "age":2, "name":"bb"}]}})

我知道我可以尝试始终“按顺序”执行带有字段的查询,但从我当前的任务角度来看,这并不总是可能的。有什么帮助吗?

【问题讨论】:

  • 您能否解释一下为什么我们无法在进行查询之前处理请求以使其以排序形式出现?

标签: mongodb mongodb-query


【解决方案1】:

当您想针对对象数组运行查询时,您需要 $elemMatch:

db.col.find({ $or: [ { "ids": { $elemMatch: {"age":1,"name":"aa"} } }, { "ids": { $elemMatch: { "age":2, "name":"bb"} } } ] })

Mongo Playground

编辑:您可以决定 $or 或 $and 是否应该是顶级运算符(取决于您的用例)

【讨论】:

  • 是的,问题是我用 $or 尝试过类似的方法,结果发现性能很差。这就是我尝试使用 $in 的原因,它提供了更好的性能,但是当字段的顺序发生变化时它却失败了
  • @macpak 这是因为它们的工作方式不同。 $in 检查精确匹配,而 $elemMatch 是一组应用于每个元素的规则 - 这就是为什么顺序没有区别
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2019-08-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多