¿Cómo ordenar una matriz dentro del registro de la colección en MongoDB?
Tengo una colección de estudiantes, cada uno con un registro similar al siguiente y quiero ordenar la scores
matriz en orden descendente score
.
¿Cómo se ve ese encantamiento en el caparazón de Mongo?
> db.students.find({'_id': 1}).pretty()
{
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" : [
{
"type" : "exam",
"score" : 60.06045071030959
},
{
"type" : "quiz",
"score" : 52.79790691903873
},
{
"type" : "homework",
"score" : 71.76133439165544
},
{
"type" : "homework",
"score" : 34.85718117893772
}
]
}
Estoy probando este encantamiento....
doc = db.students.find()
for (_id,score) in doc.scores:
print _id,score
pero no funciona.
Aceptado
Deberá manipular la matriz incrustada en el código de su aplicación o utilizar el nuevo marco de agregación en MongoDB 2.2.
Ejemplo de agregación en el mongo
shell:
db.students.aggregate(
// Initial document match (uses index, if a suitable one is available)
{ $match: {
_id : 1
}},
// Expand the scores array into a stream of documents
{ $unwind: '$scores' },
// Filter to 'homework' scores
{ $match: {
'scores.type': 'homework'
}},
// Sort in descending order
{ $sort: {
'scores.score': -1
}}
)
Salida de muestra:
{
"result" : [
{
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" : {
"type" : "homework",
"score" : 71.76133439165544
}
},
{
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" : {
"type" : "homework",
"score" : 34.85718117893772
}
}
],
"ok" : 1
}
A partir de Mongo 5.2
, este es el caso de uso exacto para el nuevo $sortArray
operador de agregación:
// {
// name: "Aurelia Menendez",
// scores: [
// { type: "exam", score: 60.06 }
// { type: "quiz", score: 52.79 }
// { type: "homework", score: 71.76 }
// { type: "homework", score: 34.85 }
// ]
// }
db.collection.aggregate([
{ $set: {
scores: {
$sortArray: {
input: "$scores",
sortBy: { score: -1 }
}
}
}}
])
// {
// name: "Aurelia Menendez",
// scores: [
// { type: "homework", score: 71.76 },
// { type: "exam", score: 60.06 },
// { type: "quiz", score: 52.79 },
// { type: "homework", score: 34.85 }
// ]
// }
Este:
- ordena (
$sortArray
) lascores
matriz (input: "$scores"
) - aplicando una especie en
score
s (sortBy: { score: -1 }
) - sin tener que aplicar una combinación de etapas costosas
$unwind
y$sort
$group