mongo array addtoset mongodb size sql-order-by

mongodb - array - Mongo ordena por longitud de matriz



mongodb aggregate push array (2)

Estoy usando $ project para esto:

db.test.aggregate([ { $project : { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } } }, { $sort: {"answers_count":1} } ])

Permite incluir también documentos con respuestas vacías. Pero también tiene desventajas (o algunas veces ventajas): debe agregar manualmente todos los campos necesarios en el paso del proyecto.

Digamos que tengo mongo documentos como este:

Pregunta 1

{ answers:[ {content: ''answer1''}, {content: ''2nd answer''} ] }

Pregunta 2

{ answers:[ {content: ''answer1''}, {content: ''2nd answer''} {content: ''The third answer''} ] }

¿Hay alguna manera de ordenar la colección por el tamaño de las respuestas?

Después de un poco de investigación, vi sugerencias de agregar otro campo, que contendría el número de respuestas y lo usaría como referencia, pero ¿puede ser que haya una manera nativa de hacerlo?


Pensé que podrías usar $size , pero eso solo es para encontrar arreglos de cierto tamaño, no para ordenar.

De la documentación de mongo: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

No puede usar $ size para buscar un rango de tamaños (por ejemplo: matrices con más de 1 elemento). Si necesita consultar un rango, cree un campo de tamaño adicional que incremente cuando agregue elementos. Los índices no se pueden usar para la porción de $ tamaño de una consulta, aunque si se incluyen otras expresiones de consulta, los índices se pueden usar para buscar coincidencias en esa parte de la expresión de consulta.

Parece que con bastante probabilidad puede hacer esto con el nuevo marco de agregación, edit: que aún no ha salido. http://www.mongodb.org/display/DOCS/Aggregation+Framework

Actualizar ahora el Framework de Agregación está fuera ...

> db.test.aggregate([ {$unwind: "$answers"}, {$group: {_id:"$_id", answers: {$push:"$answers"}, size: {$sum:1}}}, {$sort:{size:1}}]); { "result" : [ { "_id" : ObjectId("5053b4547d820880c3469365"), "answers" : [ { "content" : "answer1" }, { "content" : "2nd answer" } ], "size" : 2 }, { "_id" : ObjectId("5053b46d7d820880c3469366"), "answers" : [ { "content" : "answer1" }, { "content" : "2nd answer" }, { "content" : "The third answer" } ], "size" : 3 } ], "ok" : 1 }