MongoDB – come interrogare per un object annidato all’interno di una collezione?

Ho alcuni dati che assomigliano a questo:

[ { "_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" : "", }, 

e stavo pensando che una query come questa avrebbe dato l’id dell’inserzionista:

 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(); 

Ma la mia richiesta non ha funzionato. Qualche idea su come posso aggiungere i campi all’interno degli elementi nidificati al mio elenco di campi che voglio ottenere?

Grazie!

Utilizza la notazione a punti (ad esempio advertisers.name ) per interrogare e recuperare i campi dagli oggetti nidificati:

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

Riferimento: recupero di un sottoinsieme di campi e notazione dot

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

C’è una cosa chiamata notazione di punti che MongoDB fornisce che ti permette di guardare all’interno di matrici di elementi. Usarlo è semplice come aggiungere un punto per ogni array che vuoi inserire.

Nel tuo caso

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

Se vuoi entrare nella serie di inserzionisti per cercare la proprietà created_at all’interno di ognuno di essi, puoi semplicemente scrivere la query con la proprietà {‘ advertisers.created_at ‘: query} come segue

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