2011-12-20 15 views
6

tengo un documento en Mongo que está estructurado de la siguiente manera:Consulta de lista anidada Existencia en Mongo

{ 
    "_id" : ObjectId("4eea7237d0ba3a04f20008fb"), 
    "code" : "b2677c2809c844cc9d7e3e4ff8d95b46", 
    "city_id" : 4, 
    "datetime" : ISODate("2011-12-13T18:41:44.062Z"), 
    "plays" : [  
     { 
      "play_id" : 717224, 
      "clicks" : [ ], 
      "order" : 1, 
      "mysql_id" : 145 
     } 

Quiero consultar los documentos cuya plays.clicks atributo es una lista no vacía. Lo intenté sin suerte. Pensé que algo como esto podría funcionar:

db.collection.find({plays.clicks.0: {$exists:true}}) 

Pero creo que esto sólo devolvería documentos cuyo primer elemento de la matriz jugadas contiene una lista no vacía clics.

¿Alguna idea sobre cómo puedo hacer esto?

Gracias

Respuesta

7

db.collection.find({plays.clicks.0: {$exists:true}})

es el derecho sintaxis, sin embargo, como plays es una lista, la consulta coincidirá con cualquier documento que tenga clics en plays. No hay forma de recuperar un subconjunto de una matriz para subelementos de esta manera [1]. Hay una entrada para sub colecciones virtuales/[2]

[1] http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

[2] https://jira.mongodb.org/browse/SERVER-828

+0

Gracias Ross, esta es probablemente la mejor respuesta (aunque la propuesta de desnormalización adicional es una alternativa razonable). – Ben

3

Guardar el tamaño de la lista como un atributo independiente (por ejemplo num_plays). A continuación, puede consultar los documentos donde num_plays es mayor que 0:

+0

que podía hacer esto. Desde el punto de vista de la lectura, esto probablemente permite las consultas más rápidas. – Ben