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
}