Definición
$setUnionToma dos o más arreglos y devuelve un arreglo que contiene los elementos que aparecen en cualquier arreglo de entrada.
$setUniontiene la siguiente sintaxis:{ $setUnion: [ <expression1>, <expression2>, ... ] } Los argumentos pueden ser cualquier expresión válida, siempre que cada uno se resuelva en un arreglo. Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
$setUnion realiza operaciones de conjuntos en arreglos, tratándolos como conjuntos. Si un arreglo contiene entradas duplicadas, $setUnion ignora dichas entradas. $setUnion ignora el orden de los elementos.
$setUnion filtra duplicados en su resultado para generar 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.
Ejemplo | Resultado | ||
|---|---|---|---|
| | ||
| |
Nota
A partir de MongoDB 5.2, el orden de clasificación para $setUnion no está definido. Para ordenar un array, consulte $sortArray.
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 $setUnion para devolver una matriz de elementos encontrados en la matriz flowerFieldA o en la matriz flowerFieldB 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" ] }