2012-06-04 8 views
54

Mam pewne dane, które wygląda tak:MongoDB - jak zapytać o element zagnieżdżony w kolekcji?

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

i myślałem, że kwerenda tak dałoby identyfikator reklamodawcy:

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

Ale moje zapytanie nie działa. Każdy pomysł, w jaki sposób mogę dodać pola wewnątrz zagnieżdżonych elementów do mojej listy pól, które chcę uzyskać?

Dzięki!

Odpowiedz

92

Zastosowanie kropka notacji (np advertisers.name) do kwerendy i pobrać pola z zagnieżdżonych obiektów:

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

referencyjny: Retrieving a Subset of Fields i Dot Notation

+0

Wszystko jest pod danymi w pytaniu. To znaczy. Warunki są błędne. – AD7six

+8

Powinien używać 'findOne' zamiast' find' z '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()? czy to prawda? –

+0

To .pretty(), nie .pritty() :) –

+2

Czy nie .findOne() bardziej idiomatyczne niż .limit (1) też? – Ben

1

Jest jedna rzecz, o nazwie zapis dot że MongoDB zapewnia dzięki czemu możesz zajrzeć do wnętrza tablic elementów. Korzystanie z niego jest tak proste, jak dodanie kropki dla każdej tablicy, którą chcesz wprowadzić.

W twoim przypadku

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

Jeśli chcesz wejść do środka tablicy reklamodawców szukać created_at własności wewnątrz każdego z nich, można po prostu napisać kwerendę z właściwością {”reklamodawców. created_at "zapytanie" podobne do następującego:

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

Nie tylko skopiowałeś zaakceptowaną odpowiedź, ale bardzo ją skopiowałeś, 'advertisers {name: true}' nie jest valiudową składnią, nawet jeśli poprawiłeś błędy fizyczne MongoDB nie czyta dokumentu projekcji w ten sposób – Sammaye

Powiązane problemy