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