Definición
$[]El operador de posición total
$[]indica que el operador de actualización debe modificar todos los elementos del campo de arreglo especificado.El operador
$[]tiene el siguiente formato:{ <update operator>: { "<array>.$[]" : value } } Usar en operaciones de actualización, por ejemplo
db.collection.updateOne()ydb.collection.findAndModify(), para modificar todos los elementos de arreglos de los documentos o documentos que coincidan con la condición de query. Por ejemplo:db.collection.updateOne( { <query conditions> }, { <update operator>: { "<array>.$[]" : value } } ) Para ver un ejemplo, consulta Actualizar todos los elementos de un arreglo.
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.
upsert
Si una operación de inserción da como resultado una inserción, el query debe incluir una coincidencia exacta en el campo de arreglo para poder utilizar el $[] operador posicional en la instrucción de actualización.
Por ejemplo, la siguiente operación de inserción, que utiliza $[] en el documento de actualización, especifica una condición de coincidencia exacta en el campo del arreglo:
db.collection.updateOne( { myArray: [ 5, 8 ] }, { $set: { "myArray.$[]": 10 } }, { upsert: true } )
Si no existe dicho documento, la operación dará como resultado la inserción del siguiente documento:
{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] }
Si la operación de inserción no incluyó una coincidencia exacta y no se encontraron documentos coincidentes para actualizar, la operación de inserción generaría un error.
Por ejemplo, las siguientes operaciones generarían un error si no se encontraran documentos coincidentes para actualizar:
db.emptyCollection.updateOne( { }, { $set: { "myArray.$[]": 10 } }, { upsert: true } ) db.emptyCollection.updateOne( { myArray: 5 }, { $set: { "myArray.$[]": 10 } }, { upsert: true } )
Arreglos anidados
El operador $[] se puede utilizar para consultas que recorren más de una matriz y matrices anidadas.
Para un ejemplo, consulta Actualizar arreglos anidados en conjunción con $[<identifier>].
Ejemplos
Actualizar todos los elementos de una matriz
Crear la colección students:
db.students.insertMany( [ { "_id" : 1, "grades" : [ 85, 82, 80 ] }, { "_id" : 2, "grades" : [ 88, 90, 92 ] }, { "_id" : 3, "grades" : [ 85, 100, 90 ] } ] )
Para incrementar todos los elementos de la grades matriz en 10 para todos los documentos de la colección, utilice el operador $[] posicional:
db.students.updateMany( { }, { $inc: { "grades.$[]": 10 } }, )
El $[] operador posicional actúa como un marcador de posición para todos los elementos en el campo de matriz.
Después de la operación, la colección students contiene los siguientes documentos:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 102 ] } { "_id" : 3, "grades" : [ 95, 110, 100 ] }
Actualizar todos los documentos en un arreglo
El operador posicional $[] facilita las actualizaciones en arreglos que contienen documentos incrustados. Para acceder a los campos en los documentos incrustados, utilice la notación de puntos con el operador $[].
db.collection.updateOne( { <query selector> }, { <update operator>: { "array.$[].field" : value } } )
Crear la colección students2:
db.students2.insertMany( [ { "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 8 }, { "grade" : 85, "mean" : 90, "std" : 6 }, { "grade" : 85, "mean" : 85, "std" : 8 } ] }, { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 8 }, { "grade" : 87, "mean" : 90, "std" : 5 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] } ] )
Para modificar el valor del campo std para todos los elementos en el arreglo grades, utiliza el operador posicional $[]:
db.students2.updateMany( { }, { $inc: { "grades.$[].std" : -2 } }, )
Después de la operación, la colección tiene los siguientes documentos:
{ "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] } { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] }
Actualizar matrices especificadas mediante un operador de consulta de negación
Crear la colección results:
db.results.insertMany( [ { "_id" : 1, "grades" : [ 85, 82, 80 ] }, { "_id" : 2, "grades" : [ 88, 90, 92 ] }, { "_id" : 3, "grades" : [ 85, 100, 90 ] } ] )
Para incrementar todos los elementos de la grades matriz en 10 para todos los documentos excepto aquellos con el valor 100 en la grades matriz, utilice el operador $[] posicional:
db.results.updateMany( { "grades" : { $ne: 100 } }, { $inc: { "grades.$[]": 10 } }, )
El $[] operador posicional actúa como un marcador de posición para todos los elementos en el campo de matriz.
Después de la operación, la colección students contiene los siguientes documentos:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 102 ] } { "_id" : 3, "grades" : [ 85, 100, 90 ] }
Actualizar arreglos anidados en conjunto con $[<identifier>]
El operador posicional $[], junto con el filtro $[<identifier>], se puede utilizar el operador posicional para actualizar arreglos anidados.
Cree una colección students3 con los siguientes documentos:
db.students3.insertMany( [ { "_id" : 1, "grades" : [ { type: "quiz", questions: [ 10, 8, 5 ] }, { type: "quiz", questions: [ 8, 9, 6 ] }, { type: "hw", questions: [ 5, 4, 3 ] }, { type: "exam", questions: [ 25, 10, 23, 0 ] }, ] } ] )
Para actualizar todos los valores que sean mayores o iguales a 8 en el arreglo anidado grades.questions, independientemente de type:
db.students3.updateMany( {}, { $inc: { "grades.$[].questions.$[score]": 2 } }, { arrayFilters: [ { "score": { $gte: 8 } } ] } )
Los documentos actualizados se ven así:
{ _id: 1, grades: [ { type: 'quiz', questions: [ 12, 10, 5 ] }, { type: 'quiz', questions: [ 10, 11, 6 ] }, { type: 'hw', questions: [ 5, 4, 3 ] }, { type: 'exam', questions: [ 27, 12, 25, 0 ] } ] }
Obtén más información
Para ejemplos que utilizan el operador $[] para actualizar arreglos, consulta Actualizar elementos de arreglo en un documento con operadores posicionales de MQL.