Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$addToSet (operador de atualização)

$addToSet

O operador adiciona um valor a uma array, a $addToSet $addToSet menos que o valor já esteja presente, caso em que não faz nada com essa array.

Você pode utilizar o $addToSet para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O operador tem o $addToSet formato:

{ $addToSet: { <field1>: <value1>, ... } }

Para especificar um <field> em um documento incorporado ou em uma array, use a notação de ponto.

A partir do MongoDB 5.0, os operadores de atualização processam campos de documento com nomes baseados em cadeia de caracteres em ordem lexicográfica. Os campos com nomes numéricos são processados em ordem numérica. Consulte Atualizar Comportamento de Operadores para detalhes.

$addToSet apenas garante que não haja itens duplicados adicionados ao definir e não afeta os elementos duplicados existentes. não garante uma ordenação específica dos elementos no conjunto$addToSet modificado.

A partir do MongoDB,5.0 mongod não gera mais um erro quando você usa um operador de atualização como $addToSet com uma expressão de operando vazia ( { } ). Uma atualização vazia não resulta em nenhuma alteração e nenhuma entrada no oplog é criada (o que significa que a operação é um no-op).

Se você usar em um campo $addToSet $addToSet ausente do documento para atualizar, criará o campo de array com o valor especificado como seu elemento.

Se você usar em um $addToSet campo que não seja uma array, a operação falhará.

Por exemplo, crie a collection pigments:

db.pigments.insertOne( { _id: 1, colors: "blue, green, red" } )

O colors campo não é uma array. A seguinte operação $addToSet falha:

db.pigments.updateOne(
{ _id: 1 },
{ $addToSet: { colors: "mauve" } }
)

Se o valor for uma array, acrescentará a$addToSet array inteira como um único elemento.

Crie a coleção alphabet:

db.alphabet.insertOne( { _id: 1, letters: ["a", "b"] } )

A seguinte operação anexa a array [ "c", "d" ] ao campo letters:

db.alphabet.updateOne(
{ _id: 1 },
{ $addToSet: { letters: [ "c", "d" ] } }
)

A array [ "c", "d" ] é adicionada como um único elemento:

{ _id: 1, letters: [ 'a', 'b', [ 'c', 'd' ] ] }

Dica

Para adicionar cada elemento do valor separadamente, utilize o $each modificador $addToSet com. Consulte $each Modificador para obter detalhes.

Se o valor for um documento, o MongoDB determinará que o documento é duplicado se um documento existente na array corresponder exatamente ao documento a ser adicionado. Ou seja, o documento existente tem exatamente os mesmos campos e valores e os campos estão na mesma ordem. A ordem dos campos é importante e você não pode especificar que o MongoDB compare apenas um subconjunto dos campos no documento para determinar se o documento é uma duplicata de um elemento de array existente.

Crie a coleção inventory:

db.inventory.insertOne(
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
)

A operação a seguir adiciona o elemento "accessories" à array tags, uma vez que "accessories" não existe na array:

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "accessories" } }
)

A seguinte operação não tem efeito $addToSet porque "camera" já é um elemento da tags array:

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "camera" } }
)

Você pode utilizar o operador$addToSetcom o modificador$each. O modificador$eachpermite que o operador$addToSetadicione vários valores ao campo de array.

Uma collection inventory possui o seguinte documento:

db.inventory.insertOne (
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
)

Em seguida, a operação a seguir usa o operador$addToSetcom o modificador$eachpara adicionar vários elementos à array tags:

db.inventory.updateOne(
{ _id: 2 },
{ $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
)

A operação só adiciona "camera" e "accessories" à array tags. "electronics" já estava na array:

{
_id: 2,
item: "cable",
tags: [ "electronics", "supplies", "camera", "accessories" ]
}