2013-08-08 4 views
1

J'essaye de faire une requête qui recherche une valeur dans beaucoup de sous-réseaux en utilisant MongoDB. Le schéma db ressemble à ceci:MongoDB - Comment rechercher une valeur dans des tableaux imbriqués?

user: 
[ 
{ 
name: "SomeName", 
dvd: [ 
    { 
     collectionName: "ActionDVDs", 
     movies: [ 
     { 
     _id: ObjectId(X), 
     mark: 10 
     }, 
     { 
     _id: ObjectId(Y), 
     mark: 8 
     } 
    } 
    ] 
} 
... 
] 

Je sais que trois informations: user.name, dvd.collectioName, movies._id.

Par exemple, j'essaie de savoir s'il y a un utilisateur nommé "SomeName", ayant un film avec l'ObjectId (X) dans la collection de DVD nommée "ActionDVDs".

J'ai déjà essayé cette requête:

user.findOne(
{ 
    $and: [ 
    {name: "SomeName"}, 
    {dvd : { 
     $elemeMatch: { name: "ActionDVDs" } 
    }, 
    {movies: { 
     $elemMatch: { _id: ObjectId(X) } 
    } 
    ] 
}) 

Toute idée?

Répondre

3

Cela devrait le faire, vous devez imbriquer le chèque de movies à l'intérieur dvd, ou il égalerons le film dans une collection de films;

db.user.findOne(
    {'name':'SomeName', 
    'dvd': {$elemMatch: {'collectionName':'ActionDVDs', 
          'movies': {$elemMatch: { '_id': ObjectId('X')}}}}}) 
+0

Cette réponse fonctionne bien. Merci :) – Day

3

Je pense que cela va vous donner un indice:

user.find({ 
    name: "SomeName", 
    "dvd.name": "ActionDVDs", 
    "dvd.movies._id": ObjectId(X) 
}) 
+0

En fait, les deux réponses fonctionnent. Merci à vous aussi:) – Day

Questions connexes