Pour répondre à vos besoins avec le cadre d'agrégation, la première étape du pipeline sera un $match
opération sur le passager en question qui fait correspondre les documents avec l'utilisateur dans le tableau de passagers, suivi du $unwind
opération qui déconstruit le tableau de passagers à partir des documents d'entrée de l'opération précédente pour générer un document pour chaque élément. Un autre $match
l'opération sur le tableau déconstruit suit qui filtre davantage le flux de documents précédent pour autoriser uniquement les documents correspondants à passer non modifiés dans l'étape suivante du pipeline, qui projette les champs requis avec le $project
opérateur. Donc, essentiellement, votre pipeline d'agrégation pour user3
sera comme :
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Résultat :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
MISE À JOUR :
Pour regrouper les doublons sur des pilotes avec des dates différentes, comme vous l'avez mentionné, vous pouvez faire un $group
opération juste avant le dernier $project
étape du pipeline où vous calculez le nombre total de passagers à l'aide de la $sum
opérateur :
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
}
}
])
Résultat :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}