Definición
Nota
Desambiguación
$setEl operador
$setreemplaza el valor de un campo con el valor especificado.
Compatibilidad
Puedes usar $set 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.
Sintaxis
La expresión del operador $set tiene la siguiente forma:
{ $set: { <field1>: <value1>, ... } }
Para especificar un <field> en un documento incrustado o en un arreglo, utiliza notación de puntos.
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.
Si el campo no existe, $set agrega un campo nuevo con el valor especificado si el nuevo campo cumple con una restricción de tipo. Si se especifica una ruta con puntos para un campo inexistente, $set crea los documentos incrustados según sea necesario para cumplir con la ruta punteada hacia el campo.
Si especificas varios pares campo-valor, $set actualizará o creará cada campo.
A partir de MongoDB 5.0, mongod ya no genera un error cuando utiliza un operador de actualización como $set con una expresión de operando vacía ( { } ). Una actualización vacía no produce cambios y no genera ninguna entrada en el oplog (lo que significa que la operación es una “no-op").
Ventajas de $set
El operador $set proporciona las siguientes ventajas en comparación con la sustitución del documento completo:
Actualizaciones Dirigidas:
$setmodifica solo los campos especificados, asegurando actualizaciones eficientes al evitar guardados innecesarios y gastos en general cuando trabajas con documentos grandes.Entradas de Oplog eficientes:
$setoptimiza la replicación escribiendo solo los campos actualizados en el oplog en lugar de todo el documento. Este proceso reduce el tamaño de las entradas de oplog y permite que los nodos repliquen los cambios de manera más eficiente.Lógica simplificada: Las aplicaciones que utilizan
$setno necesitan calcular los campos modificados antes de enviar una actualización. MongoDB reduce la complejidad al gestionar el cálculo de deltas internamente.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Configurar campos de nivel superior
El siguiente ejemplo utiliza el operador $set para añadir los campos label y status al documento de película coincidente:
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { label: "Award Winner", status: "classic" } } )
La operación devuelve el siguiente resultado:
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
Configurar campos en documentos incrustados
El siguiente ejemplo utiliza la notación de puntos para actualizar el campo highlight del documento incrustado imdb en la película coincidente:
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { "imdb.highlight": "Critics' Choice" } } )
La operación devuelve el siguiente resultado:
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
Importante
El ejemplo anterior utiliza la notación de puntos para actualizar el campo highlight del documento incrustado imdb. El siguiente formato en su lugar reemplaza el documento incrustado completo, removiendo todos los demás campos de imdb:
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { imdb: { highlight: "Critics' Choice" } } } )
Elementos del conjunto en arreglos
El siguiente ejemplo usa el operador $set para actualizar el primer elemento (índice de arreglo 0) del arreglo genres en el documento de película correspondiente:
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { "genres.0": "Thriller" } } )
La operación devuelve el siguiente resultado:
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
Para obtener operadores de actualización adicionales para arreglos, consulta Operadores de actualización de arreglos.