【问题标题】:Query for any nested subdocuments查询任何嵌套的子文档
【发布时间】:2013-08-28 02:52:42
【问题描述】:

我想对多个子文档的给定嵌套值执行查询。

在下面的示例中,我想跨多个“product_types”对象执行搜索。

{
  "product_types": {
    "type_1": [
      {
        name: "something",
        price: 100
      },
      {
        name: "something else",
        price: 50
      }
    ],
    "type_2": [
      {
        name: "another one",
        price: 20
      },
      {
        name: "and a last one",
        price: 30
      }
    ]
  }
}

我知道美元符号匹配任何子文档。这是我想出的以“价格”值为 100 的方式获得所有产品的方法。但它不起作用。有什么想法吗?

db.inventory.find( { product_types.$.price : 100 } )

PS:我预计一些答案会说这种存储产品的数据库设计会非常糟糕,我同意;这只是说明我想要执行的查询类型的示例。

【问题讨论】:

  • 位置运算符 ($) 匹配数组中的元素。在您的情况下,product_type 不是数组。即使是正在尝试的 find() 查询也不正确(假设 product_type 是一个数组)。
  • 谢谢!找到关于该主题的另一篇文章。 stackoverflow.com/questions/6179871/…

标签: mongodb


【解决方案1】:

MongoDB 不支持任何类型的通配符属性,就像您在此处尝试使用 $ 所做的那样。但是,您可以使用 $or 运算符搜索多个属性:

db.inventory.find({ $or: [
  { product_types.type_1.price: 100 },
  { product_types.type_2.price: 100 }
]})

但这将返回完整的匹配文档,而不仅仅是匹配的数组元素,因此您还必须在代码中对文档进行后处理才能将它们提取出来。

【讨论】:

    【解决方案2】:

    嵌入文档的搜索可以做为

    db.inventory.find({"product_types.type_1.price":100})
    

    字段名应该在“”里面!否则会抛出语法错误。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2020-11-28
      • 2017-09-13
      • 2018-03-09
      • 2018-08-06
      • 2016-04-23
      • 2021-02-25
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多