Definición
Nota
Desambiguación
La página siguiente hace referencia al operador de actualización. Para la etapa de $set agregación,$set consulte.
$setEl operador reemplaza el valor de un campo con el valor
$setespecificado.
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 $set expresión del operador 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 nuevo campo con el valor especificado, siempre que el nuevo campo no infrinja ninguna restricción de tipo. Si se especifica una ruta de acceso discontinua para un campo inexistente, crea$set los documentos incrustados necesarios para completar dicha ruta.
Si especifica varios pares campo-valor, actualiza o crea cada$set campo.
A partir de MongoDB 5.0, mongodya no genera un error cuando se utiliza un operador de actualización como$setcon una expresión de operando vacía ( { } ). Una actualización vacía no produce cambios y no se crea ninguna entrada en el oplog (lo que significa que la operación no tiene efecto).
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 $set operador para agregar los campos label y status al documento de película correspondiente:
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 utiliza el operador para actualizar el primer elemento (índice $set de 0 matriz) de la genres matriz 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.