Definición
$[]El operador posicional
$[]indica que el operador de actualización debe modificar todos los elementos en el campo de matriz especificado.El operador
$[]tiene el siguiente formato:{ <update operator>: { "<array>.$[]" : value } } Úselo en operaciones de actualización, por ejemplo
db.collection.updateOne()db.collection.findAndModify()y, para modificar todos los elementos de la matriz del documento o documentos que coinciden con la condición de consulta. Por ejemplo:db.collection.updateOne( { <query conditions> }, { <update operator>: { "<array>.$[]" : value } } ) Para ver un ejemplo, véase Actualizar todos los elementos de una matriz.
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 upsert da como resultado una inserción, query debe incluir una coincidencia de igualdad exacta en el campo de la matriz para poder utilizar el $[] operador posicional en la declaració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 y actualización no incluía una coincidencia de igualdad exacta y no se encontraban documentos coincidentes para actualizar, la operación de inserción y actualizació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 una matriz
El $[] operador posicional facilita la actualización de matrices que contienen documentos incrustados. Para acceder a los campos de los documentos incrustados, utilice la notación de punto 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 std campo para todos los elementos de la grades matriz, utilice 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 $[<identifier>] operador posicional de filtro, se puede utilizar para actualizar matrices anidadas.
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.