MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation MongoDB avec la somme des valeurs du tableau

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
}