2013-08-31 4 views
3

J'ai une collection comme ce qui suit: -

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

Chaque document sous correspond à chaque organisation et chaque organisation a un array de items en eux.

Ce dont j'ai besoin est d'obtenir les éléments individuels sélectionnés de la matrice items, en fournissant item_id.

Je l'ai déjà essayé ceci: -

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

Mais il revient soit la liste des éléments avec * item_id * "10" OR la liste des éléments avec * item_id * "11".

Ce dont j'ai besoin, c'est, ce sont les valeurs get pour item_id 10 et 11 pour l'organisation "abc". S'il vous plaît aider.

Répondre

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

mise à jour:

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

vieux Vous avez besoin du aggregation framework, en particulier $unwind opérateur:

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

Merci pour la réponse romaine. Mais ce dont j'ai besoin, c'est de ne pas sélectionner * tous * les "items". Désolé si je n'étais pas clair, mais ce dont j'ai besoin est de spécifier le 'item_id's des éléments dont j'ai besoin des données. – Sparky

+0

@Sparky ok, voir mis à jour, nous verrons si je vous ai compris maintenant :). Vous devez spécifier 'items' dans le premier paramètre de' find'. –

+0

Je pense que vous comprenez ce dont j'ai besoin maintenant, mais la requête mise à jour me donne également tous les éléments dans l'organisation donnée (_id: 5) :( – Sparky

Questions connexes