sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregación de MongoDB con suma de valores de matriz

Para satisfacer sus necesidades con el marco de agregación, la primera etapa de canalización será un $match operación en el pasajero en cuestión que hace coincidir los documentos con el usuario en la matriz de pasajeros, seguida de $unwind operación que deconstruye la matriz de pasajeros a partir de los documentos de entrada en la operación anterior para generar un documento para cada elemento. Otra $match A continuación, se realiza una operación en la matriz deconstruida que filtra aún más el flujo de documentos anterior para permitir que solo los documentos coincidentes pasen sin modificar a la siguiente etapa de canalización, que proyecta los campos obligatorios con $project operador. Básicamente, su canal de agregación para user3 será como:

db.collection.aggregate([
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$unwind": "$passengers"
     },
     {
        "$match": {
            "passengers.user": "user3"
        }
     },
     {
         "$project": {
             "_id": 0,
            "driver": "$driver",
            "times": "$passengers.times"
        }
     }
])

Resultado :

/* 0 */
{
    "result" : [ 
        {
            "driver" : "user1",
            "times" : 3
        }, 
        {
            "driver" : "user2",
            "times" : 2
        }
    ],
    "ok" : 1
}

ACTUALIZAR :

Para agrupar duplicados en conductores con diferentes fechas, como mencionaste, puedes hacer un $group operación justo antes del último $project etapa de canalización en la que calcula el tiempo total de pasajeros utilizando el $sum operador:

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
        }
     }
])

Resultado :

/* 0 */
{
    "result" : [ 
        {
            "total" : 2,
            "driver" : "user2"
        }, 
        {
            "total" : 3,
            "driver" : "user1"
        }
    ],
    "ok" : 1
}