【问题标题】:MongoDB finding within embedded documentsMongoDB 在嵌入式文档中查找
【发布时间】:2018-09-24 19:37:39
【问题描述】:

使用在以下位置找到的示例:

https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

拥有:

db.inventory.insertMany( [
   { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
   { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
   { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
   { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

及以后查询:

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

在“instock”子文档中返回一组具有仓库 = A 和 qty=5 的文档

但仅查询包含 {warehouse: "A"} 的内容不会返回任何结果

db.inventory.find( { "instock": { warehouse: "A" } } )

现在,将其更改为:

db.inventory.find( { "instock.warehouse": "A" })

解决

两者不应该一样吗? 关于语义的任何信息?

另一方面,在另一个子文档列表(嵌入的嵌入)中的子文档列表中查找字段值的正确方法是什么

谢谢!

【问题讨论】:

    标签: mongodb mongoose querying subdocument


    【解决方案1】:

    当您点击查询时: db.inventory.find( { "instock": { warehouse: "A" } } ) 它检查 instock 数组下面只有 一个字段 的文档。在这种情况下,它就像$eq 检查。这就是你得到零结果的原因。

    另一方面,您的文档同时存在warehouse: "A"qty: 5

    这就是为什么您的第二个查询: db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } ) 返回结果。

    第三个查询: db.inventory.find( { "instock.warehouse": "A" }) 是访问嵌入文档中的字段的正确方法。

    代替这个查询: db.inventory.find( { "instock": { warehouse: "A" } } )

    您还可以使用$elemMatch 访问文档数组中的字段。 db.inventory.find({ "instock": {$elemMatch:{warehouse: "A"} }})

    【讨论】:

    • 感谢 Rahul 的明确回答。使用 $elemMatch 意味着失去性能?假设我在文档的子文档数组中嵌入了一个子文档数组,如何查询子文档的 id ?
    • $elemMatch 匹配同一个嵌套文档中的条件,而点符号匹配所有嵌套文档中的条件。所以如果你想检查一个特定的嵌套文档是否同时存在warehouse: "A"qty: 5,那么你需要使用$elemMatch。如果您改用点表示法,它将签入满足条件的所有文档。所以检查不限于单个嵌套文档。希望你能理解。
    • @NelsonLaRocca 类似于"a.b":{$elemMatch:{c:"test", d:"test"}}
    • 非常感谢拉胡尔。我认为 MongoDB 应该在他们的文档中更深入地了解这个主题。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2016-07-01
    • 2021-08-07
    • 2018-09-04
    相关资源
    最近更新 更多