Ada beberapa pendekatan berbeda yang dapat Anda gunakan di sini:
-
Gunakan peta/kurangi:jangan lakukan ini. Saat ini akan jauh lebih cepat untuk menjalankan kerangka kerja agregasi 3 kali daripada menggunakan fungsi pengurangan peta untuk kasus penggunaan ini.
-
Jalankan agregasi 3 kali. Ini tidak optimal, tetapi jika Anda tidak memiliki batasan waktu maka ini adalah opsi termudah. Jika agregasi Anda membutuhkan waktu
-
Inilah solusi terbaik yang dapat saya pikirkan.
$group
operator memungkinkan Anda membuat_id
pada beberapa bidang. Misalnya.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Melakukan hal ini membuat pengelompokan untuk semua kombinasi yang ada dari kunci Anda yang berbeda. Anda berpotensi dapat mengelompokkan kunci Anda dengan cara ini dan kemudian secara manual menjumlahkan seluruh hasil di klien.
Biarkan saya menguraikan. Katakanlah kita memiliki koleksi bentuk. Bentuk-bentuk ini dapat memiliki warna, ukuran, dan jenis (persegi, lingkaran, dll). Agregasi pada ID multi-kunci dapat terlihat seperti:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
dan kembali:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... dan seterusnya
Anda kemudian akan meringkas hasil sisi klien, dengan jumlah entri yang berkurang secara drastis. Dengan asumsi jumlah nilai unik untuk setiap kunci cukup kecil dibandingkan dengan jumlah total dokumen, Anda dapat melakukan langkah terakhir ini dalam waktu yang dapat diabaikan.