MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Use a agregação do MongoDB para encontrar a interseção de dois conjuntos dentro do mesmo documento


Você não estava muito longe da solução completa com estrutura de agregação - você precisava de mais uma coisa antes do $group passo e isso é algo que permite que você veja se todas as coisas que estão sendo usadas combinam com algo que é propriedade.

Aqui está o pipeline completo
> 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}})

e sua saída em seu documento
{
    "result" : [
        {
            "_id" : {
                "house" : 123,
                "item" : "sofa"
            },
            "hasWhatHeUses" : 0
        }
    ],
    "ok" : 1
}

Explicação - depois de desembrulhar ambas as matrizes, você agora deseja sinalizar os elementos em que o item usado é igual ao item de propriedade e dar a eles uma "pontuação" diferente de 0. Agora, quando você reagrupa as coisas por houseId, pode verificar se algum item usado não correspondeu. Usar 1 e 0 para pontuação permite que você faça uma soma e agora uma correspondência para item que tenha soma 0 significa que foi usado, mas não correspondeu a nada em "propriedade". Espero que você tenha gostado disso!