嵌入式文档中的MongoDB查找

时间:2018-04-14 17:04:46

标签: mongodb mongoose querying subdocument

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

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的文件。子文档

但仅查询包含{仓库:" A"}的人不会返回任何结果

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

现在,将其更改为:

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

解决了

不应该都是一样的吗? 有关语义的一切吗?

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

谢谢!

1 个答案:

答案 0 :(得分: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"} }})