For at opnå dine behov med aggregeringsramme, vil det første pipelinetrin være en $match
operation på den pågældende passager, der matcher dokumenterne med brugeren i passagerarrayet, efterfulgt af $unwind
operation, som dekonstruerer passagerarrayet fra inputdokumenterne i den foregående operation for at udlæse et dokument for hvert element. Endnu en $match
operation på det dekonstruerede array følger, som yderligere filtrerer den forrige dokumentstrøm for kun at tillade, at matchende dokumenter passerer uændret ind i det næste pipelinestadie, som projicerer de påkrævede felter med $project
operatør. Så i det væsentlige din aggregeringspipeline for user3
vil være sådan:
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
}
OPDATERING :
For at gruppere dubletter på drivere med forskellige datoer, som du nævnte, kan du lave en $group
operation lige før det sidste $project
pipeline-fase, hvor du beregner de samlede passagertider ved hjælp af $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
}