MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB Aggregazione con la somma dei valori dell'array

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
}