Definición
Toma dos o más matrices y devuelve una única matriz que contiene los elementos únicos que aparecen en cualquier matriz de entrada. $setUnion se puede utilizar como un acumulador de agregación o un operador de matriz.
Acumulador de agregación
$setUnion está disponible como acumulador en estas etapas:
Sintaxis
Cuando se utiliza como acumulador de agregación, $setUnion tiene la siguiente sintaxis:
{ $setUnion: "<array field>" }
Comportamiento
$setUnion realiza operaciones de conjunto en matrices, tratándolas como conjuntos. Si una matriz contiene entradas duplicadas, $setUnion las ignora. $setUnion ignora el orden de los elementos.
$setUnion filtra los duplicados en su resultado para producir un arreglo que contenga solo entradas únicas. El orden de los elementos en el arreglo de salida no está especificado.
Si un conjunto contiene un elemento de matriz anidada, $setUnion no desciende a la matriz anidada sino que evalúa la matriz en el nivel superior.
Los argumentos que son null o se resuelven en null se incluyen en los resultados. Los argumentos que hacen referencia a un campo faltante no se incluyen en los resultados.
Ejemplo
Cree una colección llamada sales con los siguientes documentos:
db.sales.insertMany( [ { _id: 1, items: [ "laptop", "tablet" ], location: "NYC" }, { _id: 2, items: [ "phone", "tablet" ], location: "NYC" }, { _id: 3, location: "NYC" }, { _id: 4, items: [ "desktop", { "accessories": [ "mouse", "keyboard"] } ], location: "NYC" } ] )
Este ejemplo muestra cómo usar $setUnion como acumulador. Este ejemplo acumula todos los elementos únicos de las matrices items al agrupar en el campo location:
db.sales.aggregate( [ { $group: { _id: "$location", array: { "$setUnion": "$items" } } } ] )
La operación devuelve el siguiente resultado:
[ { "_id": "NYC", "array": [ "laptop", "tablet", "phone", "desktop", { "accessories": [ "mouse", "keyboard"] } ] } ]
Operador de arreglos
Sintaxis
Cuando se utiliza como operador de matriz, $setUnion tiene la siguiente sintaxis:
{ $setUnion: [ <expression1>, <expression2>, ... ] }
Comportamiento
$setUnion realiza operaciones de conjunto en matrices, tratándolas como conjuntos. Si una matriz contiene entradas duplicadas, $setUnion las ignora. $setUnion ignora el orden de los elementos.
$setUnion filtra los duplicados en su resultado para producir un arreglo que contenga solo entradas únicas. El orden de los elementos en el arreglo de salida no está especificado.
Los argumentos pueden ser cualquier expresión válida, siempre que se resuelvan en un array. Para más información sobre expresiones, consulte Expresiones.
Si un conjunto contiene un elemento de matriz anidada, $setUnion no desciende a la matriz anidada sino que evalúa la matriz en el nivel superior.
Ejemplo | Resultado | notas | |||||
|---|---|---|---|---|---|---|---|
| | Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados. | |||||
| | Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados. | |||||
| | Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados. | |||||
| | El resultado incluye | |||||
| | El resultado consiste en los elementos únicos del segundo arreglo porque el primer arreglo está vacío. | |||||
| | Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados. |
Ejemplo
Considere una colección flowers con los siguientes documentos:
db.flowers.insertMany( [ { "_id" : 1, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ] }, { "_id" : 2, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ] }, { "_id" : 3, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ] }, { "_id" : 4, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ] }, { "_id" : 5, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ] }, { "_id" : 6, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ] }, { "_id" : 7, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ] }, { "_id" : 8, "flowerFieldA" : [ ], "flowerFieldB" : [ ] }, { "_id" : 9, "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ] } ] )
La siguiente operación utiliza el operador para devolver una matriz de elementos que se encuentran en $setUnion la flowerFieldA matriz o en la flowerFieldB matriz o en ambas:
db.flowers.aggregate( [ { $project: { flowerFieldA:1, flowerFieldB: 1, allValues: { $setUnion: [ "$flowerFieldA", "$flowerFieldB" ] }, _id: 0 } } ] )
La operación devuelve los siguientes resultados:
{ "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "rose", "orchid" ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "orchid", "rose", "orchid" ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "rose", "orchid", "jasmine" ], "allValues": [ "orchid", "rose", "jasmine" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "jasmine", "rose" ], "allValues": [ "orchid", "rose", "jasmine" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ [ "rose" ], [ "orchid" ] ], "allValues": [ "orchid", "rose", [ "rose" ], [ "orchid" ] ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ [ "rose", "orchid" ] ], "allValues": [ "orchid", "rose", [ "rose", "orchid" ] ] } { "flowerFieldA": [ ], "flowerFieldB": [ ], "allValues": [ ] } { "flowerFieldA": [ ], "flowerFieldB": [ "rose" ], "allValues": [ "rose" ] }
Limitaciones
$setUnionsolo admite arreglos y expresiones que se resuelven en un arreglo.$setUnionno garantiza el orden de los elementos en la matriz de salida.