Definición
$setIntersectionToma dos o más arreglos y retorna un arreglo que contiene los elementos que aparecen en cada arreglo de entrada.
$setIntersectiontiene la siguiente sintaxis:{ $setIntersection: [ <array1>, <array2>, ... ] } Los argumentos pueden ser cualquier válido. expresión siempre y cuando cada una resuelva a un arreglo. Para obtener más información sobre expresiones, consulta Expresiones.
Comportamiento
$setIntersection realiza operaciones de conjunto en arreglos, tratando los arreglos como conjuntos. Si un arreglo contiene entradas duplicadas, $setIntersection ignora las entradas duplicadas. $setIntersection ignora el orden de los elementos.
$setIntersection 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 no se encuentran intersecciones (es decir, los arreglos de entrada no contienen elementos comunes), $setIntersection devuelve un arreglo vacío.
Si un conjunto contiene un elemento de arreglo anidado, $setIntersection no desciende al arreglo anidado, sino que evalúa el arreglo en el nivel superior.
Ejemplo | Resultado | ||
|---|---|---|---|
| | ||
| |
Ejemplo
Esta sección contiene ejemplos que muestran el uso de $setIntersection con colecciones.
Ejemplo de arreglo de elementos
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 usa el operador $setIntersection para devolver un arreglo de elementos comunes tanto al arreglo flowerFieldA como al arreglo flowerFieldB:
db.flowers.aggregate( [ { $project: { flowerFieldA: 1, flowerFieldB: 1, commonToBoth: { $setIntersection: [ "$flowerFieldA", "$flowerFieldB" ] }, _id: 0 } } ] )
La operación devuelve los siguientes resultados:
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "commonToBoth" : [ "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "commonToBoth" : [ ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "commonToBoth" : [ ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "commonToBoth" : [ ] } { "flowerFieldA" : [ ], "flowerFieldB" : [ ], "commonToBoth" : [ ] } { "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "commonToBoth" : [ ] }