Docs Menu
Docs Home
/ /

$setUnion

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.

$setUnion

$setUnion está disponible como acumulador en estas etapas:

  • $bucket

  • $bucketAuto

  • $group

  • $setWindowFields

Cuando se utiliza como acumulador de agregación, $setUnion tiene la siguiente sintaxis:

{ $setUnion: "<array field>" }

$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.

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"] }
]
}
]
$setUnion

Cuando se utiliza como operador de matriz, $setUnion tiene la siguiente sintaxis:

{
$setUnion: [ <expression1>, <expression2>, ... ]
}

$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
{ $setUnion: [
[ "a", "c" ],
[ "a", "b" ]
] }
[ "a", "c", "b" ]

Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados.

{ $setUnion: [
[ "a", "c" ],
[ "a", "b", "c" ]
] }
[ "a", "c", "b" ]

Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados.

{ $setUnion: [
[ "a", "b", "a" ],
[ "b", "a" ]
] }
[ "a", "b" ]

Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados.

{ $setUnion: [
[ "a", "b" ],
[ [ "a", "b" ] ]
] }
[ "a", "b", [ "a", "b" ] ]

El resultado incluye "a" y "b" como elementos de cadena individuales y la matriz [ "a", "b" ] como un elemento único.

{ $setUnion: [
[ ],
[ "a", "b" ]
] }
[ "a", "b" ]

El resultado consiste en los elementos únicos del segundo arreglo porque el primer arreglo está vacío.

{ $setUnion: [
[ "a", "a" ],
[ "a", "b" ]
] }
[ "a", "b" ]

Se combinan todos los elementos de ambas matrices y se eliminan los elementos duplicados.

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" ] }
  • $setUnion solo admite arreglos y expresiones que se resuelven en un arreglo.

  • $setUnion no garantiza el orden de los elementos en la matriz de salida.

Volver

$setIsSubset

En esta página