Untuk memenuhi kebutuhan Anda dengan kerangka kerja agregasi, tahap pipeline pertama adalah $match
operasi pada penumpang yang bersangkutan yang cocok dengan dokumen dengan pengguna di jajaran penumpang, diikuti dengan $unwind
operasi yang mendekonstruksi susunan penumpang dari dokumen input di operasi sebelumnya untuk mengeluarkan dokumen untuk setiap elemen. $match
lainnya operasi pada larik yang didekonstruksi mengikuti yang selanjutnya memfilter aliran dokumen sebelumnya untuk memungkinkan hanya dokumen yang cocok yang lolos tanpa dimodifikasi ke tahap saluran pipa berikutnya, yang memproyeksikan bidang yang diperlukan dengan $project
operator. Jadi pada dasarnya pipa agregasi Anda untuk user3
akan menjadi seperti:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Hasil :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
PERBARUI :
Untuk mengelompokkan duplikat pada driver dengan tanggal berbeda, seperti yang Anda sebutkan, Anda dapat melakukan $group
operasi tepat sebelum $project
terakhir tahap pipeline tempat Anda menghitung total waktu penumpang menggunakan $sum
operator:
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
}
}
])
Hasil :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}