Docs Menu
Docs Home
/ /

$setDifference (agregación)

$setDifference

Takes two sets and returns an array containing the elements that only exist in the first set; i.e. performs a complemento relativo of the second set relative to the first.

$setDifference tiene la siguiente sintaxis:

{ $setDifference: [ <expression1>, <expression2> ] }

Los argumentos pueden ser cualquier válido. expresión, siempre que cada una de ellas se resuelva en una matriz. Para más información sobre expresiones, consulte Expresiones.

$setDifference realiza operaciones de conjunto en matrices, tratándolas como conjuntos. Si una matriz contiene entradas duplicadas, $setDifference las ignora. $setDifference ignora el orden de los elementos.

$setDifference 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, $setDifference no desciende al arreglo anidado, sino que evalúa el arreglo en el nivel superior.

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

"a" is present in both arrays, so it is removed from the result. "c" is only present in the first array.

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

Tanto "a" como "c" están presentes en ambas matrices, por lo que se eliminan del resultado. No quedan más elementos en la primera matriz.

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

Tanto "a" como "b" están presentes en ambas matrices, por lo que se eliminan del resultado. Los duplicados también se eliminan. No quedan más elementos en la primera matriz.

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

Las cadenas "a" y "b" de la primera matriz no se encuentran en la segunda matriz, que contiene una matriz anidada.

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

La primera matriz está vacía, por lo que no hay elementos para restar, independientemente de lo que haya en la segunda matriz.

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

"a" is present in the second array so it is removed from the result. Duplicates are also removed. No more elements remain in the first array.

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 $setDifference la flowerFieldB matriz pero no en la flowerFieldA matriz:

db.flowers.aggregate(
[
{ $project: { flowerFieldA: 1, flowerFieldB: 1, inBOnly: { $setDifference: [ "$flowerFieldB", "$flowerFieldA" ] }, _id: 0 } }
]
)

La operación devuelve los siguientes resultados:

{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "inBOnly" : [ [ "rose" ], [ "orchid" ] ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "inBOnly" : [ [ "rose", "orchid" ] ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "inBOnly" : [ "rose" ] }

Volver

$serializeEJSON

En esta página