Per soddisfare le tue esigenze con il framework di aggregazione, la prima fase della pipeline sarà una $match
operazione sul passeggero in questione che accoppia i documenti con l'utente nell'array passeggeri, seguita dal $unwind
operazione che decostruisce l'array passeggeri dai documenti di input nell'operazione precedente per produrre un documento per ciascun elemento. Un altro $match
segue un'operazione sull'array decostruito che filtra ulteriormente il flusso di documenti precedente per consentire solo ai documenti corrispondenti di passare non modificati alla fase successiva della pipeline, che sta proiettando i campi richiesti con il $project
operatore. Quindi essenzialmente la tua pipeline di aggregazione per user3
sarà come:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Risultato :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
AGGIORNAMENTO :
Per raggruppare i duplicati su conducenti con date diverse, come hai detto puoi fare un $group
operazione appena prima dell'ultimo $project
fase della pipeline in cui calcoli i tempi totali dei passeggeri utilizzando il $sum
operatore:
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
}
}
])
Risultato :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}