sql >> Databáze >  >> NoSQL >> MongoDB

Použijte agregaci MongoDB k nalezení průsečíku množin dvou množin v rámci stejného dokumentu

Nebyli jste příliš daleko od úplného řešení s agregačním rámcem - před $group jste potřebovali ještě jednu věc krok a to je něco, co by vám umožnilo zjistit, zda všechny věci, které se používají, odpovídají něčemu, co je vlastněno.

Zde je úplný seznam

> 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}})

a jeho výstup ve vašem dokumentu

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

Vysvětlení – jakmile rozbalíte obě pole, nyní chcete označit prvky, kde se použitá položka rovná vlastněné položce, a dát jim „skóre“ jiné než 0. Nyní, když přeskupíte věci zpět podle houseId, můžete zkontrolovat, zda se některé použité položky neshodovaly. Použití 1 a 0 pro skóre vám umožňuje provést součet a nyní shoda pro položku, která má součet 0, znamená, že byla použita, ale neodpovídala ničemu v "vlastněno". Doufám, že se vám to líbilo!



  1. Jak udělat vlastní mapování pomocí mongo konektoru s elasticsearch

  2. 20 Pozoruhodný rozdíl mezi Hadoopem 2.x a Hadoopem 3.x

  3. Jak projektovat DBRef na jarní agregaci MongoDB?

  4. Redis se v systému Windows 7 nespustí jako služba systému Windows