MongoDB - Select multiple sub-dicuments from array using $elemMatch

arrays, mongodb, mongodb-query

Solution

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

update:

db.organizations.find({
    "_id": 5,
    items: {$elemMatch: {"item_id": {$in: ["10", "11"]}}}
})

old Looks like you need aggregation framework, particularly $unwind operator:

db.organizations.aggregate([
    {$match:{_id:5}}, // you can remove this to return all your data
    {$unwind:"$items"}
])

Problem

I have a collection like the following:- ``` { _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 ] } ] } ``` Each sub document corresponds to individual organizations and each organization has an `array` of `items` in them. What I need is to get the select individual elements from the `items` array, by providing `item_id`. I already tried this:- ``` db.organizations.find({"_id": 5}, {items: {$elemMatch: {"item_id": {$in: ["10", "11"]}}}}) ``` But it is returning either the item list with *item_id* "10" `OR` the item list with *item_id* "11". What I need is is the get values for both item_id 10 and 11 for the organization "abc". Please help.

Original source