Definición
Cambiado en la versión 5.0.
$addToSet devuelve una matriz de todos los valores únicos que resultan de aplicar una expresión a cada documento de un grupo.
El orden de los elementos en el arreglo devuelto es indefinido.
$addToSet está disponible en estas etapas:
$setWindowFields(Disponible a partir de MongoDB 5.0)
Sintaxis
$addToSet sintaxis:
{ $addToSet: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Si el valor de la expresión es una matriz, agrega toda$addToSet la matriz como un solo elemento.
Si el valor de la expresión es un documento, MongoDB determina que el documento es un duplicado si otro documento del arreglo coincide exactamente con el documento que se va a agregar. En concreto, el documento existente tiene exactamente los mismos campos y valores en el mismo orden.
Ejemplos
Uso en la etapa $group
Considera una colección sales con los siguientes documentos:
db.sales.insertMany( [ { _id : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }, { _id : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }, { _id : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }, { _id : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }, { _id : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:12:00Z") } ] )
Agrupando los documentos por el día y el año del date campo, la siguiente operación utiliza el acumulador para calcular la lista de artículos únicos vendidos para cada $addToSet grupo:
db.sales.aggregate( [ { $group: { _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } }, itemsSold: { $addToSet: "$item" } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : { "day" : 46, "year" : 2014 }, "itemsSold" : [ "xyz", "abc" ] } { "_id" : { "day" : 34, "year" : 2014 }, "itemsSold" : [ "xyz", "jkl" ] } { "_id" : { "day" : 1, "year" : 2014 }, "itemsSold" : [ "abc" ] }
Uso en la etapa $setWindowFields
Nuevo en la versión 5.0.
Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y Washington (WA):
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
Este ejemplo utiliza $addToSet en la etapa para generar $setWindowFields las type ventas únicas de pasteles para state cada:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { cakeTypesForState: { $addToSet: "$type", window: { documents: [ "unbounded", "current" ] } } } } } ] )
En el ejemplo:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { orderDate: 1 }ordena los documentos de cada partición pororderDateen orden ascendente (1), de modo que elorderDatemás antiguo sea el primero.
outputagrega cada pastel únicotypealcakeTypesForStatecampo de matriz usando que se$addToSetejecuta en una ventana de documentos.La ventana contiene documentos entre un
unboundedlímite inferior y elcurrentdocumento. Esto significa que$addToSetdevuelve una matriz que contiene los campos únicos de pasteltypepara los documentos entre el inicio de la partición y el documento actual.
En este ejemplo de salida, el arreglo type para CA y WA se muestra en el campo cakeTypesForState:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "cakeTypesForState" : [ "strawberry" ] } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "cakeTypesForState" : [ "strawberry", "chocolate" ] } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "cakeTypesForState" : [ "strawberry", "vanilla", "chocolate" ] } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "cakeTypesForState" : [ "strawberry" ] } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "cakeTypesForState" : [ "vanilla", "strawberry" ] } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "cakeTypesForState" : [ "vanilla", "chocolate", "strawberry" ] }