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
}