Definición
$setDifferenceToma dos conjuntos y devuelve un arreglo que contiene los elementos que solo existen en el primer conjunto; es decir, realiza una complemento relativo del segundo conjunto respecto al primero.
$setDifferencetiene la siguiente sintaxis:{ $setDifference: [ <expression1>, <expression2> ] } 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
$setDifference realiza operaciones de conjunto en arreglos, tratando los arreglos como conjuntos. Si un arreglo contiene entradas duplicadas, $setDifference ignora las entradas duplicadas. $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 | |||||
|---|---|---|---|---|---|---|---|
| |
| |||||
| | Tanto | |||||
| | Tanto | |||||
| | Las cadenas | |||||
| | El primer arreglo está vacío, por lo que no hay elementos de los cuales restar, independientemente de lo que haya en el segundo arreglo. | |||||
| |
|
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 $setDifference para devolver un arreglo de elementos que se encuentran en el arreglo flowerFieldB pero no en el arreglo flowerFieldA:
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" ] }