2012-06-04 5 views
54

J'ai des données qui ressemble à ceci:MongoDB - comment rechercher un élément imbriqué dans une collection?

[ 
    { 
     "_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
     "advertisers" : [ 
      { 
       "created_at" : ISODate("2011-07-26T21:02:19Z"), 
       "category" : "Infinity Pro Spin Air Brush", 
       "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
       "lowered_name" : "conair", 
       "twitter_name" : "", 
       "facebook_page_url" : "", 
       "website_url" : "", 
       "user_ids" : [ ], 
       "blog_url" : "", 
      }, 

et je pensais qu'une requête comme cela donnerait l'id de l'annonceur:

var start = new Date(2011, 1, 1); 
> var end = new Date(2011, 12, 12); 
> db.agencies.find({ "created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , advertisers { name : 1 } }).limit(1).toArray(); 

Mais ma requête n'a pas fonctionné. Une idée de comment je peux ajouter les champs à l'intérieur des éléments imbriqués à ma liste de champs que je veux obtenir?

Merci!

Répondre

92

Utiliser la notation par points (par exemple advertisers.name) pour interroger et récupérer des champs à partir d'objets imbriqués:

db.agencies.find({ "advertisers.created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , "advertisers.name": 1 } }).limit(1).toArray(); 

Référence: Retrieving a Subset of Fields et Dot Notation

+0

Tout est sous données dans la question. C'est à dire. Les conditions sont fausses – AD7six

+8

Devrait utiliser 'findOne', plutôt que' find' avec 'limit (1)'. – EmmaGamma

3
db.agencies.find( 
{ "advertisers.created_at" : {$gte : start , $lt : end} } , 
{ program_ids : 1 , advertisers.name : 1 } 
).limit(1).pretty(); 
+1

.pritty()? Est-ce correct? –

+0

C'est .pretty(), pas .pritty() :) –

+2

Est-ce que .findOne() n'est pas aussi idiomatique que .limit (1)? – Ben

1

Il y a une chose appelée notation point que MongoDB fournit Cela vous permet de regarder à l'intérieur des tableaux d'éléments. L'utiliser est aussi simple que d'ajouter un point pour chaque tableau que vous voulez entrer.

Dans votre cas

"_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
    "advertisers" : [ 
     { 
      "created_at" : ISODate("2011-07-26T21:02:19Z"), 
      "category" : "Infinity Pro Spin Air Brush", 
      "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
      "lowered_name" : "conair", 
      "twitter_name" : "", 
      "facebook_page_url" : "", 
      "website_url" : "", 
      "user_ids" : [ ], 
      "blog_url" : "", 
     }, 
     { ... } 

Si vous voulez aller à l'intérieur du tableau des annonceurs à rechercher created_at de propriété à l'intérieur chacun d'eux, vous pouvez simplement écrire la requête avec la propriété { » annonceurs. created_at ': query} comme suit

db.agencies.find({ 'advertisers.created_at' : { {$gte : start , $lt : end} ... } 
+0

Non seulement vous avez copié la réponse acceptée mais vous l'avez mal copiée, 'advertisers {name: true}' n'est pas une syntaxe valiud même si vous corrigiez les erreurs physiques MongoDB ne lit pas un document de projection de cette façon – Sammaye

Questions connexes