За да постигнете нуждите си с рамката за агрегиране, първият етап на конвейера ще бъде $match
операция на въпросния пътник, която съпоставя документите с потребителя в масива от пътници, последвана от $unwind
операция, която деконструира масива от пътници от входните документи в предишната операция, за да изведе документ за всеки елемент. Друго $match
следва операцията върху деконструирания масив, която допълнително филтрира предишния поток от документи, за да позволи само съвпадащите документи да преминат непроменени в следващия етап на конвейера, който проектира задължителните полета с $project
оператор. Така че по същество вашият конвейер за агрегиране за user3
ще бъде като:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Резултат :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
АКТУАЛИЗИРАНЕ :
За групиране на дубликати на драйвери с различни дати, както споменахте, можете да направите $group
операция точно преди последния $project
етап на тръбопровода, където изчислявате общия брой пътници с помощта на $sum
оператор:
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
}
}
])
Резултат :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}