2011-09-30 17 views
8

Tengo un documento que será similar a:MongoDB ordenar por subdocumento contar

{ 
     "_id" : ObjectId("4e84f78b26d2046d5d00b5b2"), 
     "parent_id" : 0, 
     "ratings" : [ 
       "20716", 
       "78167" 
     ], 
     "text" : "test" 
} 

¿Es posible clasificar a la cuenta de "ratings"? Hacer algo como:

db.comments.find().sort({rating.count(): -1})

genera un error:

SyntaxError: missing : after property id (shell):0

Respuesta

8

Eso no es directamente posible con mongodb [1]

Una solución, si se utiliza con frecuencia esta consulta, es incrementar y disminuir un 'conteo' de campo cada vez que modifique la matriz de calificaciones y clasifique en ese campo.

documento

Se verá como:

{ 
    "_id" : ObjectId("4e84f78b26d2046d5d00b5b2"), 
    "parent_id" : 0, 
    "ratings" : [ 
      "20716", 
      "78167" 
    ], 
    count : 2 
    "text" : "test" 
} 

y su búsqueda con

db.comments.find().sort({count: -1}) 
+0

sí, esta es la única opción hasta ahora, esto es lo que el estado 10gen en sus diapositivas de diseño –

+0

y con el nuevo marco de agregación, ¿sigue siendo la única opción? – basilboli

16

Hay una respuesta marcada ya, pero pensé que me gustaría añadir que esto se puede hacer mediante la agregación marco:

db.comments.aggregate([ 
    { $unwind: "$ratings" }, 
    { $group : { _id : { parent_id: "$parent_id", text: "$text" }, 
       ratingsCount : { $sum : 1 } } }, 
    { $sort : { ratingsCount : -1 } } 
])