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

MongoDB-Aggregation mit Summe von Array-Werten

Um Ihre Anforderungen mit dem Aggregationsframework zu erfüllen, ist die erste Pipeline-Phase ein $match Vorgang für den betreffenden Passagier, der die Dokumente mit dem Benutzer im Passagier-Array abgleicht, gefolgt von $unwind Operation, die das Passagier-Array aus den Eingabedokumenten in der vorherigen Operation dekonstruiert, um ein Dokument für jedes Element auszugeben. Ein weiteres $match Es folgt eine Operation für das dekonstruierte Array, die den vorherigen Dokumentenstrom weiter filtert, damit nur übereinstimmende Dokumente unverändert in die nächste Pipeline-Stufe geleitet werden, die die erforderlichen Felder mit dem $project projiziert Operator. Also im Wesentlichen Ihre Aggregationspipeline für user3 wird wie folgt aussehen:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$project": {
             "_id": 0,
            "driver": "$driver",
            "times": "$passengers.times"
        }
     }
])

Ergebnis :

/* 0 */
{
    "result" : [ 
        {
            "driver" : "user1",
            "times" : 3
        }, 
        {
            "driver" : "user2",
            "times" : 2
        }
    ],
    "ok" : 1
}

AKTUALISIEREN :

Um Duplikate von Fahrern mit unterschiedlichen Daten zu gruppieren, können Sie, wie Sie erwähnt haben, eine $group erstellen Operation kurz vor dem letzten $project Pipeline-Phase, in der Sie die Gesamtfahrzeiten mit $sum berechnen Betreiber:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$group": {
             "_id": "$driver", 
             "total": {
                 "$sum": "$passengers.times"
             }
         }
     },
     {
         "$project": {
            "_id": 0,
            "driver": "$_id",
            "total": 1
        }
     }
])

Ergebnis :

/* 0 */
{
    "result" : [ 
        {
            "total" : 2,
            "driver" : "user2"
        }, 
        {
            "total" : 3,
            "driver" : "user1"
        }
    ],
    "ok" : 1
}