Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$setUnion (operador de expresión)

Toma dos o más arreglos y devuelve un solo arreglo que contiene los elementos únicos que aparecen en cualquier arreglo de entrada. $setUnion puede ser utilizado como un acumulador de agregación o un operador de arreglo.

$setUnion

$setUnion está disponible como acumulador en estas etapas:

  • $bucket

  • $bucketAuto

  • $group

  • $setWindowFields

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

{ $setUnion: "<array field>" }

$setUnion realiza operaciones de conjunto en arreglos, tratando los arreglos como conjuntos. Si un arreglo contiene entradas duplicadas, $setUnion ignora las entradas duplicadas. $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 arreglo anidado, $setUnion no desciende en el arreglo anidado, sino que evalúa el arreglo a nivel superior.

Se incluirán en los resultados los argumentos que sean null o se resuelvan en null. Los argumentos que se refieren a un campo que falta 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 arreglos, tratando los arreglos como conjuntos. Si un arreglo contiene entradas duplicadas, $setUnion ignora las entradas duplicadas. $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 cada uno se resuelva en un arreglo. Para obtener más información sobre las expresiones, consulta Expresiones.

Si un conjunto contiene un elemento de arreglo anidado, $setUnion no desciende en el arreglo anidado, sino que evalúa el arreglo a nivel superior.

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

Todos los elementos de ambos arreglos se combinan y se eliminan los elementos duplicados.

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

Todos los elementos de ambos arreglos se combinan y se eliminan los elementos duplicados.

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

Todos los elementos de ambos arreglos se combinan y se eliminan los elementos duplicados.

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

El resultado incluye "a" y "b" como elementos de string individuales y el arreglo [ "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" ]

Todos los elementos de ambos arreglos se combinan 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 $setUnion para devolver un arreglo de elementos encontrados en el arreglo flowerFieldA, en el arreglo flowerFieldB o en ambos:

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 el arreglo de salida.

Volver

$setIsSubset

En esta página