Agregue un nuevo campo a cada documento en una colección de MongoDB
-
el operador
$set
en MongoDB -
el operador
$setOnInsert
en MongoDB - Agregar nuevo campo a documentos en una colección de MongoDB
Este artículo discutirá sobre la operación $set
y $setOnInsert
. Además, el problema de agregar un campo en colecciones en MongoDB también se explica brevemente usando estos dos operadores.
el operador $set
en MongoDB
El operador $set
cambia el valor de un campo al valor proporcionado. La expresión del operador $set
tiene este aspecto: { $set: { <campo1>: <valor1>, ... } }
.
Utilice la notación de puntos para definir un <campo>
en un texto incrustado o una matriz.
Comportamiento del Operador $set
Los operadores de actualización manejan campos de documentos con nombres basados en cadenas en orden lexicográfico a partir de MongoDB 5.0. Los campos con nombre numérico se manejan en orden numérico.
Si el campo aún no existe, $set
creará uno con el valor solicitado, siempre que el nuevo campo no rompa una restricción de tipo. Si proporciona una ruta punteada para un campo que no existe, $set
construirá los documentos incrustados según sea necesario para completar la ruta punteada.
$set
actualizará o creará cada campo si proporciona varios pares de valores de campo.
Cuando utiliza un operador de actualización como $set
con una expresión de operando vacía ({}
) en MongoDB 5.0, mongod
ya no arroja un error. No hay modificaciones debido a una actualización vacía, y no se produce ningún registro oplog
(lo que significa que la operación es un no-op).
Por ejemplo, creemos la colección ropa
:
db.clothes.insertOne(
{
_id: 100,
quantity: 250,
instock: true,
reorder: false,
details: { model: "14RR", make: "Clothes" },
tags: [ "apparel", "clothing" ],
ratings: [ { by: "Customer127", rating: 5 } ]
}
)
Establecer campos de nivel superior
El siguiente procedimiento utiliza el operador $set
para alterar el valor de los campos cantidad
, detalles
y etiquetas
para el documento que cumple el criterio _id
igual a 100
.
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
quantity: 400,
details: { model: "2600", make: "Fashionables" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
La operación actualiza lo siguiente:
- valor de
cantidad
a400
. - Campo
detalles
con el nuevo documento incrustado. - Campo
tags
con el nuevo array.
El documento ahora tiene los siguientes valores:
{
_id: 100,
quantity: 400,
instock: true,
reorder: false,
details: { model: '2600', make: 'Fashionables' },
tags: [ 'coats', 'outerwear', 'clothing' ],
ratings: [ { by: 'Customer127', rating: 5 } ]
}
Establecer campos en documentos incrustados
Utilice la notación de puntos para indicar un <campo>
en un texto incrustado o una matriz. La siguiente acción modifica el campo hacer
en el documento detalles
para el documento que cumple el criterio _id
igual a 100
:
db.clothes.updateOne(
{ _id: 100 },
{ $set: { "details.make": "Kidz" } }
)
Después de la actualización, el documento ahora tiene los siguientes valores:
Establecer elementos en matrices
Utilice la notación de puntos para indicar un <campo>
en un texto incrustado o una matriz.
La siguiente acción modifica el valor segundo elemento en el campo tags
y el campo ratings
en el primer elemento de la matriz ratings
para el documento que cumple el criterio _id
igual a 100
.
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
"tags.1": "rain wear",
"ratings.0.rating": 3
}
}
)
Después de la actualización, el documento ahora tiene los siguientes valores:
el operador $setOnInsert
en MongoDB
Si se inserta un documento debido a una operación de actualización con upsert: true
, $setOnInsert
aplica los valores proporcionados a los campos del documento. $setOnInsert
no hace nada si la acción de actualización no da como resultado una inserción.
Se puede especificar la opción upsert
.
Comportamiento del Operador $setOnInsert
Los operadores de actualización manejan campos de documentos con nombres basados en cadenas en orden lexicográfico a partir de MongoDB 5.0. Los campos con nombre numérico se manejan en orden numérico.
Cuando usa un operador de actualización como $setOnInsert
con una expresión de operando vacía ({}
) en MongoDB 5.0, mongod
ya no arroja un error. No hay modificaciones debido a una actualización vacía, y no se produce ningún registro oplog
(lo que significa que la operación es un no-op).
Por ejemplo, la colección ropa
no contiene documentos. Insertaremos un nuevo documento usando db.collection.updateOne()
con el parámetro upsert: true
.
db.clothes.updateOne(
{ _id: 1 },
{
$set: { item: "banana" },
$setOnInsert: { defaultQty: 100 }
},
{ upsert: true }
)
MongoDB utiliza <consulta>
para crear un nuevo documento con el identificador _id: 1
. $setOnInsert
realiza los cambios solicitados en el documento.
El documento recién insertado se encuentra en la colección ropa
:
{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }
Cuando el parámetro upsert
es true
, el método db.collection.updateOne()
:
- Crea un nuevo documento,
- Aplica la operación
$set
, - Aplica la operación
$setOnInsert
.
Si db.collection.updateOne()
coincide con un documento existente, MongoDB solo aplica la operación $set
.
Agregar nuevo campo a documentos en una colección de MongoDB
Puede usar los siguientes métodos para agregar un nuevo campo a cada documento en una colección en MongoDB.
También se muestran ejemplos de uso de cada método con equipos de recolección con los siguientes documentos:
db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})
Agregar nuevo campo sin valores
Sintaxis:
db.collection.updateMany({}, {$set:{"new_field": null}})
Puede usar el siguiente código para agregar un nuevo campo llamado “rebotes” con un valor “nulo” a cada documento existente en la colección:
db.teams.updateMany({}, {$set:{"rebounds": null}})
Puede escribir la siguiente consulta para ver los primeros documentos actualizados:
db.teams.find().limit(3)
Esta consulta devuelve los siguientes documentos:
Agregar nuevo campo con valor específico
Sintaxis:
db.collection.updateMany({}, {$set:{"new_field": 10}})
Puede usar el siguiente código para agregar un nuevo campo llamado rebotes
con un valor de 10
a cada documento existente en la colección:
db.teams.updateMany({}, {$set:{"rebounds": 10}})
Puede escribir la siguiente consulta para ver los primeros documentos actualizados:
db.teams.find().limit(3)
Esta consulta devuelve los siguientes documentos:
Agregar nuevo campo usando valores de campos existentes
Sintaxis:
db.collection.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
]
)
Puede usar el siguiente código para agregar un campo llamado nombre
, cuyo valor es una concatenación de los campos existentes equipo
y cargo
.
db.teams.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
]
)
Puede escribir la siguiente consulta para ver los primeros documentos actualizados:
db.teams.find().limit(3)
Esta consulta devuelve los siguientes documentos: