As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
$adicionar ToSet
O operador $addToSet de agregação retorna uma matriz de valores exclusivos de uma expressão especificada para cada grupo. Ele é usado dentro do $group estágio para acumular valores distintos, eliminando automaticamente as duplicatas.
Parâmetros
-
expression: A expressão a ser avaliada para cada documento no grupo.
Exemplo (MongoDB Shell)
O exemplo a seguir demonstra o uso do $addToSet operador para coletar cidades exclusivas nas quais os pedidos foram feitos para cada cliente.
Crie documentos de amostra
db.orders.insertMany([ { _id: 1, customer: "Alice", city: "Seattle", amount: 100 }, { _id: 2, customer: "Alice", city: "Portland", amount: 150 }, { _id: 3, customer: "Bob", city: "Seattle", amount: 200 }, { _id: 4, customer: "Alice", city: "Seattle", amount: 75 }, { _id: 5, customer: "Bob", city: "Boston", amount: 300 } ]);
Exemplo de consulta
db.orders.aggregate([ { $group: { _id: "$customer", cities: { $addToSet: "$city" } } } ]);
Saída
[
{ _id: 'Bob', cities: [ 'Seattle', 'Boston' ] },
{ _id: 'Alice', cities: [ 'Seattle', 'Portland' ] }
]
Exemplo de uso do operador de janela (MongoDB Shell)
Novo na versão 8.0.2.
O $addToSet operador também pode ser usado como operador de janela no $setWindowFields palco. Nesse contexto, ele retorna uma matriz dos valores exclusivos da expressão especificada para os documentos em cada janela. Você especifica o operador no output campo e, opcionalmente, define os limites da janela com um window documento.
nota
Quando usado como operador de janela em$setWindowFields, $addToSet é limitado a 100 MB de dados intermediários. Uma operação que excede esse limite retorna um erro.
Crie documentos de amostra
db.visits.insertMany([ { _id: 1, customer: "Alice", day: 1, city: "Seattle" }, { _id: 2, customer: "Alice", day: 2, city: "Portland" }, { _id: 3, customer: "Alice", day: 3, city: "Seattle" }, { _id: 4, customer: "Bob", day: 1, city: "Boston" }, { _id: 5, customer: "Bob", day: 2, city: "Boston" } ]);
Exemplo de consulta
O exemplo a seguir particiona os documentos porcustomer, classifica cada partição por day e retorna o conjunto de city valores exclusivos desde o início da partição até o documento atual.
db.visits.aggregate([ { $setWindowFields: { partitionBy: "$customer", sortBy: { day: 1 }, output: { citiesSoFar: { $addToSet: "$city", window: { documents: ["unbounded", "current"] } } } } } ]);
Saída
[
{ "_id": 1, "customer": "Alice", "day": 1, "city": "Seattle", "citiesSoFar": [ "Seattle" ] },
{ "_id": 2, "customer": "Alice", "day": 2, "city": "Portland", "citiesSoFar": [ "Portland", "Seattle" ] },
{ "_id": 3, "customer": "Alice", "day": 3, "city": "Seattle", "citiesSoFar": [ "Portland", "Seattle" ] },
{ "_id": 4, "customer": "Bob", "day": 1, "city": "Boston", "citiesSoFar": [ "Boston" ] },
{ "_id": 5, "customer": "Bob", "day": 2, "city": "Boston", "citiesSoFar": [ "Boston" ] }
]
Cada documento é aumentado com citiesSoFar o conjunto de city valores exclusivos em sua partição, desde o início até o documento atual. Assim como no formulário acumulador, a ordem dos valores na matriz retornada não é garantida.
Exemplos de código
Para ver um exemplo de código para usar o $addToSet operador, escolha a guia do idioma que você deseja usar. Os exemplos a seguir mostram o uso do acumulador (em$group) e o uso do operador de janela (em$setWindowFields):