2013-08-31 5 views
3

У меня есть коллекции, как следующее: -

{ 
    _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".

Что мне нужно, это - это значения для элементов item_id 10 и 11 для организации «abc». Пожалуйста помоги.

ответ

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

Спасибо за ответ Роман. Но мне нужно не выбирать * все * 'элементы'. Извините, если я не был ясен, но мне нужно указать 'item_id' элементов, из которых мне нужны данные. – Sparky

+0

@Sparky ok, см. Обновленный, мы увидим, понял ли я вас сейчас :). Вы должны указать 'items' в первом параметре' find'. –

+0

Я думаю, вы понимаете, что мне нужно сейчас, но обновленный запрос также дает мне все элементы в данной организации (_id: 5) :( – Sparky

Смежные вопросы