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
}