sql >> Databasteknik >  >> NoSQL >> MongoDB

Använd MongoDB-aggregering för att hitta skärningspunkten mellan två uppsättningar i samma dokument

Du var inte särskilt långt ifrån den fullständiga lösningen med aggregeringsramverk - du behövde en sak till innan $group steg och det är något som gör att du kan se om alla saker som används stämmer överens med något som ägs.

Här är hela pipelinen

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

och dess utdata på ditt dokument

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

Förklaring - när du väl har packat upp båda arrayerna vill du nu flagga elementen där använd objekt är lika med ägt objekt och ge dem en icke-0 "poäng". Nu när du grupperar tillbaka saker efter houseId kan du kontrollera om några använda föremål inte matchade. Genom att använda 1 och 0 för poäng kan du göra en summa och nu betyder en matchning för objekt som har summa 0 att det användes men inte matchade något i "ägd". Hoppas du gillade detta!



  1. Hur man hämtar alla samlingsnycklar som innehåller ett visst (String) värde i mongodb

  2. 6 viktiga Redis-övervakningsstatistik du behöver titta på

  3. MongoDB, uppdatera samlingsfältet om det nya värdet inte är null

  4. Vad är returtyp av db.collection.find() i mongodb