MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Agregação do MongoDB com soma de valores de array


Para atender às suas necessidades com a estrutura de agregação, o primeiro estágio do pipeline será um $match operação no passageiro em questão que corresponde aos documentos com o usuário na matriz de passageiros, seguida pelo $unwind operação que desconstrói a matriz de passageiros dos documentos de entrada na operação anterior para gerar um documento para cada elemento. Outro $match A operação no array desconstruído segue que filtra ainda mais o fluxo de documentos anterior para permitir que apenas os documentos correspondentes passem sem modificação para o próximo estágio do pipeline, que está projetando os campos obrigatórios com o $project operador. Basicamente, seu pipeline de agregação 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
}

ATUALIZAÇÃO :

Para agrupar duplicatas em drivers com datas diferentes, como você mencionou, você pode fazer um $group operação logo antes do último $project estágio de pipeline em que você calcula o tempo total de passageiros usando o $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
}