sql >> Database teknologi >  >> NoSQL >> MongoDB

Brug MongoDB-aggregering til at finde et sæt skæringspunkt mellem to sæt i det samme dokument

Du var ikke meget langt fra den fulde løsning med aggregeringsramme - du havde brug for en ting mere før $group trin, og det er noget, der giver dig mulighed for at se, om alle de ting, der bliver brugt, stemmer overens med noget, der er ejet.

Her er den fulde pipeline

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

og dets output på dit dokument

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

Forklaring - når du først udpakker begge arrays, vil du nu markere de elementer, hvor brugt vare er lig med ejet vare og give dem en ikke-0 "score". Nu, når du omgrupperer tingene efter houseId, kan du tjekke, om nogen brugte varer ikke matchede. Brug af 1 og 0 til score giver dig mulighed for at lave en sum, og nu betyder et match for element, som har sum 0, at det blev brugt, men ikke matchede noget i "ejet". Håber du nød dette!



  1. Hvordan konverteres bson til json effektivt med mongo-go-driver?

  2. Mongoose udfylder ikke (.populate()) på produktion (Heroku), men arbejder på Local

  3. Sådan bruger du $in eller $nin i mongo-aggregation $group $cond

  4. MongoError:Ukendt modifikator:$pushAll i node js