sql >> Base de Datos >  >> NoSQL >> MongoDB

Use la agregación de MongoDB para encontrar la intersección de conjuntos de dos conjuntos dentro del mismo documento

No estaba muy lejos de la solución completa con el marco de agregación:necesitaba una cosa más antes del $group paso y eso es algo que le permitiría ver si todas las cosas que se están utilizando coinciden con algo que se posee.

Aquí está la canalización completa

> db.house.aggregate(
       {'$unwind':'$uses'}, 
       {'$unwind':'$rooms'}, 
       {'$unwind':'$rooms.owns'}, 
       {$project:  { _id:0, 
                     houseId:1, 
                     uses:"$uses.name", 
                     isOkay:{$cond:[{$eq:["$uses.name","$rooms.owns.name"]}, 1, 0]}
                   }
       }, 
       {$group: { _id:{house:"$houseId",item:"$uses"}, 
                  hasWhatHeUses:{$sum:"$isOkay"}
                }
       },
       {$match:{hasWhatHeUses:0}})

y su salida en su documento

{
    "result" : [
        {
            "_id" : {
                "house" : 123,
                "item" : "sofa"
            },
            "hasWhatHeUses" : 0
        }
    ],
    "ok" : 1
}

Explicación:una vez que desenvuelva ambas matrices, ahora desea marcar los elementos donde el elemento usado es igual al elemento propio y darles una "puntuación" distinta de 0. Ahora, cuando reagrupa las cosas por houseId, puede verificar si algún artículo usado no obtuvo una coincidencia. Usar 1 y 0 para el puntaje le permite hacer una suma y ahora una coincidencia para el elemento que tiene una suma 0 significa que se usó pero no coincidió con nada en "propiedad". ¡Espero que hayas disfrutado esto!