2012-06-04 19 views
54

que tienen algunos datos que se parece a esto:MongoDB: ¿cómo consultar un elemento anidado dentro de una colección?

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

y pensaba que una consulta como esto daría a la identificación del anunciante:

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

Pero mi consulta no funcionó. ¿Alguna idea de cómo puedo agregar los campos dentro de los elementos anidados a mi lista de campos que quiero obtener?

Gracias!

Respuesta

92

Uso notación de puntos (por ejemplo advertisers.name) para consultar y recuperar los campos de objetos anidados:

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

Referencia: Retrieving a Subset of Fields y Dot Notation

+0

Todo está bajo datos en la pregunta. Es decir. Las condiciones son incorrectas – AD7six

+8

Debería estar utilizando 'findOne', en lugar de' encontrar' con '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á bien? –

+0

Es .pretty(), no .pritty() :) –

+2

¿No es .findOne() más idiomático que .limit (1) también? – Ben

1

hay una cosa llamada notación de puntos que MongoDB ofrece que le permite mirar dentro de matrices de elementos. Usarlo es tan simple como agregar un punto para cada matriz que desee ingresar.

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

Si quiere ir dentro de la gama de los anunciantes para buscar la created_at propiedad dentro de cada uno de ellos, simplemente hay que escribir la consulta con la propiedad {' anunciantes. created_at ': query} como sigue

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

No solo copió la respuesta aceptada, pero la ha copiado mal, 'publicisers {name: true}' no es una sintaxis valida, incluso si corrige los errores físicos MongoDB no lee un documento de proyección de esa manera – Sammaye

Cuestiones relacionadas