Nota
Desambiguación
$sortEl modificador
$sortordena los elementos de un arreglo durante una operación$push.Para usar el
$sortmodificador,debe aparecer junto con el modificador. Puede pasar una matriz$eachvacía[]al modificador de$each$sortmodo que solo el modificador tenga 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 permite ordenar elementos de matriz $sort $sort que no sean documentos. En versiones anteriores, el modificador requería que los elementos de matriz fueran documentos.
Si los elementos de la matriz son documentos, el modificador puede ordenar por todo el documento o por un campo específico. En versiones anteriores, el modificador solo podía ordenar por un campo $sort específico.
Intentar usar el modificador$sortsin el modificador$eachgenera un error. El modificador$sortya no requiere el modificador$slice. Para ver una lista de modificadores disponibles para$push, consulte Modificadores.
Ejemplos
Ordenar una matriz de documentos por un campo en los documentos
Crear la colección students:
db.students.insertOne( { "_id": 1, "quizzes": [ { "id" : 1, "score" : 6 }, { "id" : 2, "score" : 9 } ] } )
La siguiente actualización agrega documentos adicionales a la matriz quizzes y luego ordena todos los elementos de la matriz por el campo ascendente score:
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}
Después de la actualización, los elementos de la matriz están en orden ascendente del campo score:
{ "_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 agrega dos elementos más a la matriz tests y ordena los elementos:
db.students.updateOne( { _id: 2 }, { $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } } )
El documento actualizado tiene los elementos de la matriz tests en orden ascendente:
{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }
Actualizar matriz 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 tests campo y ordenar sus elementos en orden descendente, especifique { $sort: -1 } y una matriz vacía [] para el modificador. Por $each 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 operación $push 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 consulta no altera el orden en que se aplican. Para más detalles, consulte Modificadores.