Nota
Desambiguación
$sortEl modificador
$sortordena los elementos de un arreglo durante una operación$push.Para utilizar el modificador
$sort, debe aparecer con el modificador$each. Puedes pasar un arreglo vacío[]al modificador$eachde modo que sólo el modificador$sorttenga efecto.{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $sort: <sort specification> } } } Para
<sort specification>:Para ordenar elementos de una matriz que no sean documentos, o si los elementos de la matriz son documentos, para ordenar por todos los documentos, especifique
1para orden ascendente o-1para orden descendente.Si los elementos de la matriz son documentos, para ordenar por un campo, especifique un documento de ordenación con el campo y la dirección, por
{ field: 1 }ejemplo,{ field: -1 }o. No haga referencia al campo de la matriz que lo contiene en la especificación de ordenación (por ejemplo,{ "arrayField.field": 1 }es incorrecto).
Comportamiento
A partir de MongoDB 5.0, los operadores de actualización procesan los campos de documentos con nombres basados en cadenas en orden lexicográfico. Los campos con nombres numéricos se procesan en orden numérico. Consulta Comportamiento del operador de actualización para obtener más información.
El modificador $sort puede ordenar elementos de arreglos que no son documentos. En versiones anteriores, el modificador $sort requería que los elementos del arreglo fueran documentos.
Si los elementos del arreglo son documentos, el modificador puede ordenar ya sea por el documento completo o por un campo específico en los documentos. En versiones anteriores, el modificador $sort solo permite ordenar por un campo específico en los documentos.
Intentar utilizar el $sort modificador sin el modificador $each resulta en un error. El $sort ya no requiere el modificador $slice. Para una lista de modificadores disponibles para $push, consulta Modificadores.
Ejemplos
Ordenar un arreglo de documentos por un campo contenido en ellos
Crear la colección students:
db.students.insertOne( { "_id": 1, "quizzes": [ { "id" : 1, "score" : 6 }, { "id" : 2, "score" : 9 } ] } )
La siguiente actualización añade documentos adicionales al arreglo quizzes y luego ordena todos los elementos del arreglo por el campo score ascendente:
db.students.updateOne( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ], $sort: { score: 1 } } } } )
Importante
El documento de clasificación se refiere directamente al campo en los documentos y no hace referencia al campo de la matriz quizzes contenedora; es decir, { score: 1 } y no { "quizzes.score": 1}
Tras la actualización, los elementos del arreglo se ordenan según el campo score en orden ascendente:
{ "_id" : 1, "quizzes" : [ { "id" : 1, "score" : 6 }, { "id" : 5, "score" : 6 }, { "id" : 4, "score" : 7 }, { "id" : 3, "score" : 8 }, { "id" : 2, "score" : 9 } ] }
Ordenar elementos de matriz que no son documentos
Añada el siguiente documento a la colección students:
db.students.insertOne( { "_id" : 2, "tests" : [ 89, 70, 89, 50 ] } )
La siguiente operación añade dos elementos más al arreglo tests y ordena los elementos:
db.students.updateOne( { _id: 2 }, { $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } } )
El documento actualizado tiene los elementos del arreglo tests en orden ascendente:
{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }
Actualizar arreglo usando solo ordenamiento
Añada el siguiente documento a la colección students:
db.students.insertOne( { "_id" : 3, "tests" : [ 89, 70, 100, 20 ] } )
Para actualizar el campo tests para ordenar sus elementos en orden descendente, especifica el { $sort: -1 } y especifica un arreglo vacío [] para el modificador $each. Por ejemplo:
db.students.updateOne( { _id: 3 }, { $push: { tests: { $each: [ ], $sort: -1 } } } )
El ejemplo ordena los valores del campo tests en orden descendente:
{ "_id" : 3, "tests" : [ 100, 89, 70, 20 ] }
Utilice $sort con otros $push modificadores
Añada el siguiente documento a la colección students:
db.students.insertOne( { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } )
La siguiente $push operación utiliza:
el modificador
$eachpara agregar múltiples documentos al arregloquizzes,el modificador para ordenar todos los elementos de
$sortlaquizzesmatriz modificada por elscorecampo en orden descendente, yel modificador
$slicepara conservar solo los primeros tres elementos ordenados del arregloquizzes.
db.students.updateOne( { _id: 5 }, { $push: { quizzes: { $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], $sort: { score: -1 }, $slice: 3 } } } )
Después de la operación, solo los tres cuestionarios con mayor puntuación están en el arreglo:
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ] }
El orden de los modificadores en la query no cambia el orden en que se aplican los modificadores. Para más detalles, consulte Modificadores.