MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verwenden Sie die MongoDB-Aggregation, um die Schnittmenge von zwei Sätzen innerhalb desselben Dokuments zu finden

Sie waren nicht sehr weit von der vollständigen Lösung mit Aggregation Framework entfernt - Sie brauchten noch etwas vor der $group Schritt und das ist etwas, das es Ihnen ermöglichen würde zu sehen, ob alle Dinge, die verwendet werden, mit etwas übereinstimmen, das Sie besitzen.

Hier ist die vollständige 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}})

und seine Ausgabe in Ihrem Dokument

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

Erklärung - Sobald Sie beide Arrays ausgepackt haben, möchten Sie jetzt die Elemente markieren, bei denen das verwendete Element dem eigenen Element entspricht, und ihnen eine "Punktzahl" ungleich 0 geben. Wenn Sie jetzt die Dinge nach houseId neu gruppieren, können Sie überprüfen, ob gebrauchte Artikel keine Übereinstimmung erhalten haben. Wenn Sie 1 und 0 für die Punktzahl verwenden, können Sie eine Summe erstellen, und jetzt bedeutet eine Übereinstimmung für einen Gegenstand mit der Summe 0, dass er verwendet wurde, aber mit nichts in "Besitzer" übereinstimmte. Hoffe es hat dir gefallen!