sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $addToSet

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 ] }