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