Operador $Set de MongoDB
-
Operador MongoDB
$set
- Establecer campos de nivel superior
- Establecer campos en documentos incrustados
- Establecer elementos en matrices
-
$set
(Agregación) -
Usar dos etapas
$set
- Agregar campos a un documento incrustado
- Sobrescribir un campo existente
- Agregar elemento a una matriz
Con la ayuda de este artículo, aprenderá a usar el operador $set
para actualizar parcialmente un objeto en MongoDB, de modo que el nuevo objeto se superponga/fusione con el existente.
El operador $set
reemplaza el valor de un campo con el valor dado. La expresión del operador $set
utiliza la siguiente sintaxis.
{ $set: { <field1>: <value1>, ... } }
Especificará un <campo>
en un documento incrustado o una matriz utilizando la notación de puntos.
Operador MongoDB $set
Si el campo no existe, el operador $set
crea uno con el valor especificado, siempre que el nuevo campo no viole ninguna restricción.
Por ejemplo, si proporciona una ruta punteada para un campo que no existe, el operador $set
generará los documentos incrustados necesarios para completar la ruta punteada.
Además, el operador $set
actualizará o creará cada campo si especifica varios pares de valores de campo.
Puede crear la siguiente colección de productos
.
db={
"products": [
{
_id: 100,
quantity: 250,
instock: true,
reorder: false,
details: {
model: "PTI",
make: "Breakout"
},
tags: [
"jeans",
"clothing"
],
ratings: [
{
by: "CustomerIK",
rating: 3
}
]
}
]
}
Establecer campos de nivel superior
Para el documento que coincide con los criterios _id
es igual a 100
, la siguiente operación utiliza el operador $set
para actualizar el valor del campo detalles
, el campo cantidad
y el campo etiquetas
. La consulta para esto se da a continuación.
db.products.update(
{ _id: 100 },
{ $set:
{
quantity: 500,
details: { model: "2600", make: "Outfitters" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
La operación anterior actualiza lo siguiente.
- valor de
cantidad
a500
. - campo
detalles
con nuevo documento incrustado - campo
tags
con una nueva matriz
El resultado de la consulta anterior se muestra en la siguiente captura de pantalla.
Establecer campos en documentos incrustados
Utilizará la notación de puntos para especificar un <campo>
en un documento incrustado o una matriz. Para el documento que coincide con el criterio _id
igual a 100
, la siguiente operación actualiza el campo hacer
en el documento detalles
.
La consulta para esto se da a continuación.
db.products.update(
{ _id: 100 },
{ $set: { "details.make": "Breakout Kids" } }
)
El resultado de la consulta anterior se muestra en la siguiente captura de pantalla.
Establecer elementos en matrices
La siguiente acción modifica el valor del segundo elemento (array index de 1
) del campo tags
y el campo rating
del primer elemento (array index de 0
) del array ratings
para el documento que cumple el criterio _id
igual a 100
.
La consulta para esto se da a continuación.
db.products.update(
{ _id: 100 },
{ $set:
{
"tags.1": "wind breaker",
"ratings.0.rating": 2
}
}
)
El resultado de la consulta anterior se muestra en la siguiente captura de pantalla.
$set
(Agregación)
$set
(agregación) agrega nuevos campos a un documento. $set
genera documentos que contienen todos los campos existentes de los documentos de entrada y los campos recién agregados.
$set
(agregación) tiene la siguiente sintaxis.
{ $set: { <newField>: <expression>, ... } }
$set
es un comando que agrega nuevos campos a un documento existente. El usuario puede incluir una o más etapas $set
en una operación de agregación.
Use la notación de puntos para agregar campos o campos a documentos incrustados (incluidos documentos en matrices). Use $concatArrays
para agregar un elemento a un campo de matriz existente usando $set
.
Usar dos etapas $set
Cree una colección de “calificaciones” de muestra con lo siguiente.
db={
"grades": [
{
_id: 1,
student: "Ali",
homework: [10, 8, 9],
quiz: [9, 8],
extraCredit: 3
},
{
_id: 2,
student: "Manahil",
homework: [3, 8, 5],
quiz: [7, 9],
extraCredit: 6
}
]
}
Se utilizan dos etapas $set
en el siguiente proceso para agregar tres nuevos campos a los documentos de salida. La consulta para esto se da a continuación.
db.grades.aggregate( [
{
$set: {
totalHomework: { $sum: "$homework" },
totalQuiz: { $sum: "$quiz" }
}
},
{
$set: {
totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )
La operación devuelve los siguientes documentos, como se muestra en la siguiente captura de pantalla.
Agregar campos a un documento incrustado
Cree una colección de muestra transporte
con lo siguiente.
db={
"transport": [
{
_id: 1,
type: "sedan",
specs: { doors: 4, wheels: 4}
},
{
_id: 2,
type: "motorbike",
specs: {doors: 0, wheels: 2}
},
{
_id: 3,
type: "jet ski"
}
]
}
La siguiente operación de agregación crea un nuevo campo fuel_type
en el documento incrustado specs
. La consulta para esto se da a continuación.
db.transport.aggregate( [
{ $set: { "specs.fuel_type": "super" } }
] )
La operación devuelve los siguientes resultados, como se muestra en la siguiente captura de pantalla.
Sobrescribir un campo existente
Cuando una operación $set
especifica un nombre de campo existente, se reemplaza el campo original. Haz una colección de muestras de mascotas
con los siguientes artículos.
db={
"pets": [
{
_id: 1,
dogs: 10,
cats: 5
}
]
}
La operación $set
que sigue anula el campo cats
. La consulta para esto se da a continuación.
db.pets.aggregate( [
{ $set: { "cats": 20 } }
] )
La operación devuelve el siguiente documento, como se muestra en la siguiente captura de pantalla.
Agregar elemento a una matriz
Cree una colección de calificaciones
de muestra con los siguientes registros.
db={
"grades": [
{
_id: 1,
student: "Ali",
homework: [10, 8, 9],
quiz: [9, 8],
extraCredit: 3
},
{
_id: 2,
student: "Manahil",
homework: [3, 8, 5],
quiz: [7, 9],
extraCredit: 6
}
]
}
El usuario puede utilizar el operador $set
con una expresión $concatArrays
. Esto agrega un elemento a un campo de matriz existente.
La siguiente operación utiliza $set
para reemplazar el campo tarea
con una nueva matriz cuyos elementos son la matriz actual de tarea
concatenada con otra matriz que contiene una nueva puntuación [ 7 ]
. La consulta para esto se da a continuación.
db.grades.aggregate([
{ $match: { _id: 2 } },
{ $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])
La operación devuelve el siguiente documento, como se muestra en la siguiente captura de pantalla.
En este artículo, aprendió a usar el operador $set
para actualizar parcialmente un objeto en MongoDB para que el nuevo objeto se superponga/fusione con el existente.