Docs Menu
Docs Home
/ /
Arreglos

$[] (operador de actualización posicional de toda la matriz)

$[]

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, consulte Actualizar todos los elementos de una matriz.

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

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

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

Tip

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

Volver

$

En esta página