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
/ /

$ (actualizar operador)

$

Utilice el posicional $ operador para identificar un elemento en un arreglo a actualizar sin especificar explícitamente la posición del elemento en el arreglo.

Nota

Desambiguación

  • Para mostrar, o devolver, un elemento de un arreglo de una operación de lectura, consulte el $ operador de proyección en su lugar.

  • Para actualizar todos los elementos en un arreglo, se puede consultar en cambio el operador posicional all $[].

  • Para actualizar todos los elementos que coincidan con una condición o condiciones de filtro de arreglo, se puede consultar en cambio el operador posicional filtrado $[<identifier>].

Se puede usar el operador posicional $ para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

El operador posicional $ tiene la forma:

{ "<array>.$" : value }

Cuando utilices operaciones de actualización, como db.collection.updateOne() y db.collection.findAndModify(), se deben cumplir ambas condiciones:

  • El operador posicional $ actúa como un marcador de posición para el primer elemento que coincide con query document.

  • el campo array debe aparecer como parte de query document.

Por ejemplo:

db.collection.updateOne(
{ <array>: value ... },
{ <update operator>: { "<array>.$" : value } }
)

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.

No se debe utilizar el operador $ en operaciones de actualización o inserción. Si la query de actualización no coincide con ningún documento existente, la inserción falla porque el operador $ necesita un elemento de arreglo coincidente.

No puedes usar el operador posicional $ para consultas que abarquen más de un arreglo, como las consultas que recorren arreglos anidados dentro de otros arreglos, porque el reemplazo para el marcador de posición $ es un valor único.

Cuando usas el operador posicional $ con el operador $unset, el operador posicional no remueve el elemento coincidente del arreglo. En su lugar, lo establece en el elemento null.

Si la query coincide con el arreglo utilizando un operador de negación, como $ne, $not, o $nin, entonces no se puede utilizar el operador posicional para actualizar los valores de este arreglo.

Puede usar el operador posicional si la parte negada de la consulta está dentro de una expresión $elemMatch.

El $ operador de actualización posicional se comporta de manera ambigua cuando se filtra en múltiples campos de matriz.

Cuando el servidor ejecuta un método de actualización, primero ejecuta una query para determinar qué documentos actualizar. Si el filtro de actualización selecciona documentos en múltiples campos de arreglo, es posible que el operador de actualización posicional $ no actualice la posición correcta en el arreglo.

Para obtener más información, consulta el ejemplo.

Crear la colección students con los siguientes documentos:

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

Para actualizar el primer elemento cuyo valor es 80 a 82 en el arreglo grades, utiliza el operador posicional $ si no conoces la posición del elemento en el arreglo:

Importante

Se debe incluir el campo de arreglo como parte del documento query.

db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)

El operador posicional $ actúa como un marcador de posición para la primera coincidencia del documento de query a actualizar.

Después de la operación, la colección students contiene los siguientes documentos:

db.students.insertMany ( [
{ _id : 1, "grades" : [ 85, 82, 80 ] },
{ _id : 2, "grades" : [ 88, 90, 92 ] },
{ _id : 3, "grades" : [ 85, 100, 90 ] }
] )

El operador posicional $ permite actualizaciones en arreglos que contienen documentos incrustados. Usa el operador posicional $ para acceder a los campos en documentos incrustados. Utilice la notación de puntos en el operador $.

db.collection.updateOne(
{ <query selector> },
{ <update operator>: { "array.$.field" : value } }
)

Se puede considerar el siguiente documento en la colección students cuyo valor del elemento grades es un arreglo de documentos incrustados:

db.students.insertOne( [
{
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 85, mean: 85, std: 8 }
]
}
] )

Utiliza el operador posicional $ para actualizar el campo std del primer elemento del arreglo que coincida con la condición grade igual a 85:

Importante

Se debe incluir el campo de arreglo como parte del documento query.

db.students.updateOne(
{ _id: 4, "grades.grade": 85 },
{ $set: { "grades.$.std" : 6 } }
)

Después de la operación, el documento tiene los siguientes valores actualizados:

{
"_id" : 4,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
}

Utilice el operador para actualizar el primer elemento de la matriz $ $elemMatch que coincida con múltiples criterios de consulta especificados con el operador.

Se puede considerar el siguiente documento de la colección students cuyo valor de campo grades es un arreglo de documentos incrustados:

db.students.insertOne( [
{
_id: 5,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 }
]
}
] )

En el siguiente ejemplo, el operador $ actualiza el valor del campo std en el primer documento incrustado que tiene un campo grade con un valor menor o igual a 90 y un campo mean con un valor mayor que 80:

db.students.updateOne(
{
_id: 5,
grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
},
{ $set: { "grades.$.std" : 6 } }
)

Esta operación actualiza el primer documento incrustado que cumple con los criterios, es decir, el segundo documento incrustado en el arreglo:

{
_id: 5,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 6 },
{ grade: 90, mean: 85, std: 3 }
]
}

El operador posicional de actualización $ se comporta de forma ambigua cuando la query tiene varios campos de arreglo para filtrar los documentos de la colección.

Se puede considerar un documento en la colección students_deans_list, que contiene arreglos de información de estudiantes:

db.students_deans_list.insertMany( [
{
_id: 8,
activity_ids: [ 1, 2 ],
grades: [ 90, 95 ],
deans_list: [ 2021, 2020 ]
}
] )

En el siguiente ejemplo, el usuario intenta modificar el campo deans_list. El ejemplo filtra documentos usando los campos activity_ids, deans_list y grades, y actualiza el valor 2021 en el campo deans_list a 2022:

db.students_deans_list.updateOne(
{ activity_ids: 1, grades: 95, deans_list: 2021 },
{ $set: { "deans_list.$": 2022 } }
)

Cuando el servidor ejecuta el método updateOne anterior, filtra los documentos disponibles utilizando los valores de los campos de arreglo proporcionados. Aunque el campo deans_list se utiliza en el filtro, no es el campo utilizado por el operador de actualización posicional $ para determinar qué posición en el arreglo actualizar:

db.students_deans_list.find( { _id: 8 } )

Ejemplo de salida:

{
_id: 8,
activity_ids: [ 1, 2 ],
grades: [ 90, 95 ],
deans_list: [ 2021, 2022 ]
}

El método updateOne coincidió con el campo deans_list en 2021, pero el operador de actualización posicional $ cambió el valor 2020 a 2022.

Para evitar resultados inesperados al realizar coincidencias en múltiples matrices, utilice el operador posicional $[<identifier>] filtrado.

Tip

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

Volver

Arreglos

En esta página