我有这个数据库结构
{
"_id": 107,
"standard": {"name": "building",
"item": [{"code": 151001,
"quantity": 10,
"delivered": 8,
"um": "kg" },
{"code": 151001,
"quantity": 20,
"delivered": 6,
"um": "kg" }]
}
}
我想找到所有包含代码的对象:151001,只显示已交付的字段。
例如,它会显示如下内容:
{delivered: 8}
{delivered: 6}
到目前为止,我得到了这个查询,但它没有准确显示我想要的内容:
db.test.find(
{
"standard.item.code": 151001
}
).pretty()
答案 0 :(得分:3)
由于您的商品位于数组中,因此最好的方法是使用Aggregation Framework。
示例代码:
db.test.aggregate(
// Find matching documents (could take advantage of an index)
{ $match: {
"standard.item.code" : 151001,
}},
// Unpack the item array into a stream of documents
{ $unwind: "$standard.item" },
// Filter to the items that match the code
{ $match: {
"standard.item.code" : 151001,
}},
// Only show the delivered amounts
{ $project: {
_id: 0,
delivered: "$standard.item.delivered"
}}
)
结果:
{
"result" : [
{
"delivered" : 8
},
{
"delivered" : 6
}
],
"ok" : 1
}
您会注意到聚合中有两个$match
步骤。第一种是匹配包含该项目代码的文档。在数组上使用$unwind
后,使用该代码对项的第二个$match
限制。