Kasus dasar di sini adalah menggunakan .aggregate()
dengan $unwind
karena Anda memerlukan akses ke nilai dalam array sebagai kunci pengelompokan Anda dan tentu saja $group
karena begitulah cara Anda "mengelompokkan" sesuatu:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
])
Ini akan memberi Anda output seperti:
{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count": 45 }
Sekarang Anda benar-benar harus belajar untuk hidup dengan itu, karena "daftar" dalam format kursor default adalah hal yang baik yang secara alami dapat diubah. Juga kunci bernama IMHO tidak secara alami cocok untuk presentasi data dan Anda biasanya menginginkan properti umum dalam daftar yang dapat diubah.
Jika Anda benar-benar ingin menggunakan output kunci bernama tunggal, maka Anda akan memerlukan MongoDB 3.4.4 atau lebih tinggi untuk memiliki akses ke $arrayToObject
yang memungkinkan Anda menggunakan nilai sebagai nama kunci, dan tentu saja $replaceRoot
untuk menggunakan output ekspresi itu sebagai dokumen baru untuk menghasilkan:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": null,
"data": { "$push": { "k": "$_id", "v": "$count" } }
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
Atau jika Anda tidak memiliki opsi itu, maka Anda harus mengonversi keluaran kursor dalam kode:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
]).toArray().reduce((acc,curr) =>
Object.assign(acc,{ [curr._id]: curr.count }),
{}
)
Keduanya bergabung menjadi satu objek dengan kunci bernama dari output agregasi asli:
{
"ANTIQUES": 56,
"TOOLS": 89,
"JEWLRY": 45,
...
}
Dan itu menunjukkan bahwa hasil keluaran asli benar-benar cukup, dan biasanya Anda ingin "pembentukan ulang akhir" semacam itu dilakukan dalam kode yang menggunakan keluaran kursor, jika Anda benar-benar membutuhkan pembentukan ulang itu sejak dasar data yang dibutuhkan tetap dikembalikan.