¿Cómo ordenar una matriz dentro del registro de la colección en MongoDB?

Resuelto thefonso asked hace 12 años • 17 respuestas

Tengo una colección de estudiantes, cada uno con un registro similar al siguiente y quiero ordenar la scoresmatriz 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.

thefonso avatar Nov 19 '12 15:11 thefonso
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 mongoshell:

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
}
Stennie avatar Nov 19 '2012 13:11 Stennie

A partir de Mongo 5.2, este es el caso de uso exacto para el nuevo $sortArrayoperador 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) la scoresmatriz ( input: "$scores")
  • aplicando una especie en scores ( sortBy: { score: -1 })
  • sin tener que aplicar una combinación de etapas costosas $unwindy$sort$group
Xavier Guihot avatar Dec 26 '2021 07:12 Xavier Guihot