sql >> Database >  >> NoSQL >> MongoDB

Gebruik MongoDB-aggregatie om het snijpunt van twee sets in hetzelfde document te vinden

Je was niet ver verwijderd van de volledige oplossing met aggregatieraamwerk - je had nog één ding nodig voor de $group stap en dat is iets waarmee je kunt zien of alle dingen die worden gebruikt overeenkomen met iets dat eigendom is.

Hier is de volledige pijplijn

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

en de uitvoer ervan op uw document

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

Uitleg - als je beide arrays eenmaal hebt uitgepakt, wil je nu de elementen markeren waar het gebruikte item gelijk is aan het eigendomsitem en ze een niet-0 "score" geven. Als je nu dingen hergroepeert op huis-ID, kun je controleren of gebruikte items geen overeenkomst hebben gekregen. Als u 1 en 0 gebruikt voor de score, kunt u een som maken en nu betekent een overeenkomst voor een item met som 0 dat het is gebruikt maar niet overeenkomt met iets in "eigendom". Ik hoop dat je dit leuk vond!



  1. Aanhoudende verbinding of verbindingspooling in PHP54+ Nginx + PHPFPM + MongoDB

  2. Kan MongoClient niet importeren

  3. Mongo probeert automatisch verbinding te maken met poort 27017 (localhost)

  4. Hoe gebruik je $arrayElemAt en verwijder je velden uit dat element in MongoDB $projection?