För att uppnå dina behov med aggregeringsramverk kommer det första pipelinesteget att vara en $match
operation på passageraren i fråga som matchar dokumenten med användaren i passageraruppsättningen, följt av $unwind
operation som dekonstruerar passageraruppsättningen från inmatningsdokumenten i föregående operation för att mata ut ett dokument för varje element. Ännu en $match
operation på den dekonstruerade arrayen följer som ytterligare filtrerar den föregående dokumentströmmen för att endast tillåta matchande dokument att passera oförändrade till nästa pipelinesteg, som projicerar de obligatoriska fälten med $project
operatör. Så i huvudsak din aggregeringspipeline för user3
kommer att vara som:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Resultat :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
UPPDATERA :
För att gruppera dubbletter på drivrutiner med olika datum, som du nämnde kan du göra en $group
operation strax före det sista $project
pipeline-steg där du beräknar de totala passagerartiderna med $sum
operatör:
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
}
}
])
Resultat :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}