MongoDB - 使用$ elemMatch从数组中选择多个子文档

时间:2013-08-31 08:03:50

标签: arrays mongodb mongodb-query

我有一个如下的集合: -

{
  _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
      ]
    }
  ]
}

每个子文档都对应于各个组织,每个组织中都有arrayitems

我需要的是通过提供itemsitem_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的获取值。请帮忙。

1 个答案:

答案 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"}
])