我有一个如下的集合: -
{
_id: 5,
"org_name": "abc",
"items": [
{
"item_id": "10",
"data": [
// Values goes here
]
},
{
"item_id": "11",
"data": [
// Values goes here
]
}
]
},
// Another sub document
{
_id: 6,
"org_name": "sony",
"items": [
{
"item_id": "10",
"data": [
// Values goes here
]
},
{
"item_id": "11",
"data": [
// Values goes here
]
}
]
}
每个子文档都对应于各个组织,每个组织中都有array
个items
。
我需要的是通过提供items
从item_id
数组中选择单个元素。
我已经尝试过了: -
db.organizations.find({"_id": 5}, {items: {$elemMatch: {"item_id": {$in: ["10", "11"]}}}})
但它返回带有* item_id的项目列表*“10”OR
带有* item_id *“11”的项目列表。
我需要的是是组织“abc”的item_id 10和11的获取值。请帮忙。
答案 0 :(得分:7)
<强> UPDATE2 强>:
db.organizations.aggregate([
// you can remove this to return all your data
{$match:{_id:5}},
// unwind array of items
{$unwind:"$items"},
// filter out all items not in 10, 11
{$match:{"items.item_id":{"$in":["10", "11"]}}},
// aggregate again into array
{$group:{_id:"$_id", "items":{$push:"$items"}}}
])
<强>更新强>:
db.organizations.find({
"_id": 5,
items: {$elemMatch: {"item_id": {$in: ["10", "11"]}}}
})
旧看起来您需要aggregation framework,特别是$unwind运营商:
db.organizations.aggregate([
{$match:{_id:5}}, // you can remove this to return all your data
{$unwind:"$items"}
])