MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $ addToSet


No MongoDB, o $addToSet O operador adiciona um valor a uma matriz, a menos que o valor já esteja presente na matriz.

É semelhante ao $push operador, exceto que $push adiciona o valor mesmo se o valor já estiver presente.

Exemplo


Suponha que tenhamos uma coleção chamada products com os seguintes 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 anexar um valor a uma dessas matrizes.

Exemplo:
db.products.update(
   { _id: 1 },
   { $addToSet: { sizes: "XL" } }
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Vamos dar outra olhada em nossa coleção para verificar a mudança:
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


Se você tentar inserir um valor que já existe no array, nada acontece. Em outras palavras, $addToSet só insere o valor se ele ainda não existir.

Aqui está um exemplo de tentativa de inserir um valor que já existe.
db.products.update(
   { _id: 1 },
   { $addToSet: { sizes: "XL" } }
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

Esta mensagem nos diz que havia um documento correspondente (ou seja, o documento com um _id de 1 ), mas não houve modificações.

No exemplo anterior vimos "nModified" : 1 , mas neste exemplo vemos "nModified" : 0 . Isso porque o valor não existia quando o inserimos no exemplo anterior, mas neste exemplo ele já existe.

Podemos verificar isso olhando para a coleção novamente:
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" ] }

Adicionar vários valores


Você pode usar o $each modificador para anexar vários valores a uma matriz.

Exemplo:
db.products.update(
   { _id: 2 },
   { 
     $addToSet: { 
        sizes: {
           $each: [ "XXL", "XXXL" ]
        }
      } 
    }
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Agora vamos verificar a coleção novamente:
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 os dois valores foram anexados ao array no documento 2 como esperado.

Adicionar uma matriz à matriz


Você também pode anexar uma matriz inteira à matriz. Quando você faz isso, a matriz inteira é anexada como sua própria matriz separada.

Suponha que tenhamos uma coleção 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 anexar um array a um array assim:
db.foo.update(
   { _id: 1 },
   { $addToSet: { bar: [ 7, 8, 9] } }
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Confira a coleção:
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 ] }