Chcete-li dosáhnout vašich potřeb pomocí agregačního rámce, první fází procesu bude $match
operace s dotyčným cestujícím, která shoduje dokumenty s uživatelem v poli cestujících, následuje $unwind
operace, která dekonstruuje pole cestujících ze vstupních dokumentů v předchozí operaci, aby se vytiskl dokument pro každý prvek. Další $match
následuje operace na dekonstruovaném poli, která dále filtruje předchozí tok dokumentů, aby umožnila pouze odpovídajícím dokumentům přejít bez úprav do další fáze kanálu, což je promítání požadovaných polí pomocí $project
operátor. Tedy v podstatě váš agregační kanál pro user3
bude vypadat takto:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Výsledek :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
AKTUALIZACE :
Pro seskupení duplikátů u ovladačů s různými daty, jak jste zmínili, můžete vytvořit $group
operaci těsně před posledním $project
fáze potrubí, kde pomocí $sum
vypočítáte celkové časy cestujících operátor:
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
}
}
])
Výsledek :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}