Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$[] (operador de actualizació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() y db.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 obtener un ejemplo, consulta Actualiza todos los elementos en un arreglo.

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.

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 }
)

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>].

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 ] }

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 }
]
}

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 ] }

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 ] }
]
}

Tip

Para ejemplos que utilizan el operador $[] para actualizar arreglos, consulta Actualizar elementos de arreglo en un documento con operadores posicionales de MQL.

Volver

$ (update)

En esta página