En MongoDB, el $addToSet
El operador agrega un valor a una matriz a menos que el valor ya esté presente en la matriz.
Es similar al $push
operador, excepto que $push
agrega el valor incluso si el valor ya está presente.
Ejemplo
Supongamos que tenemos una colección llamada products
con los siguientes documentos:
db.products.find()
Resultado:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Podemos usar $addToSet
para agregar un valor a una de esas matrices.
Ejemplo:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Echemos otro vistazo a nuestra colección para verificar el cambio:
db.products.find()
Resultado:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Valores duplicados
Si intenta insertar un valor que ya existe en la matriz, no sucede nada. En otras palabras, $addToSet
solo inserta el valor si aún no existe.
Este es un ejemplo de intentar insertar un valor que ya existe.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Este mensaje nos dice que hubo un documento coincidente (es decir, el documento con un _id
de 1
), pero no hubo modificaciones.
En el ejemplo anterior vimos "nModified" : 1
, pero en este ejemplo vemos "nModified" : 0
. Eso es porque el valor no existía cuando lo insertamos en el ejemplo anterior, pero en este ejemplo ya existe.
Podemos verificar esto mirando la colección nuevamente:
db.products.find()
Resultado:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Añadir valores múltiples
Puedes usar el $each
modificador para agregar múltiples valores a una matriz.
Ejemplo:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ahora revisemos la colección nuevamente:
db.products.find()
Resultado:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL", "XXL", "XXXL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Podemos ver que los dos valores se agregaron a la matriz en el documento 2 como se esperaba.
Agregar una matriz a la matriz
También puede agregar una matriz completa a la matriz. Cuando hace esto, la matriz completa se agrega como su propia matriz separada.
Supongamos que tenemos una colección como esta:
db.foo.find()
Resultado:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Podemos agregar una matriz a una matriz como esta:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Consulta la colección:
db.foo.find()
Resultado:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }