Aby osiągnąć swoje potrzeby dzięki frameworkowi agregacji, pierwszym etapem potoku będzie $match
operacja na danym pasażerze, która dopasowuje dokumenty do użytkownika w tablicy pasażera, po której następuje $unwind
operacja, która dekonstruuje tablicę pasażerów z dokumentów wejściowych w poprzedniej operacji, aby wyprowadzić dokument dla każdego elementu. Kolejny $match
następuje operacja na zdekonstruowanej tablicy, która dodatkowo filtruje poprzedni strumień dokumentów, aby tylko pasujące dokumenty mogły przejść w niezmienionej postaci do następnego etapu potoku, czyli rzutowania wymaganych pól za pomocą $project
operator. Tak więc zasadniczo Twój potok agregacji dla user3
będzie jak:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Wynik :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
AKTUALIZACJA :
Do grupowania duplikatów na sterownikach z różnymi datami, jak wspomniałeś, możesz zrobić $group
operacja tuż przed ostatnim $project
etap potoku, w którym obliczasz całkowity czas pasażerów za pomocą $sum
operator:
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
}
}
])
Wynik :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}