Untuk menjawab pertanyaan pertama Anda:$group
apakah tidak melestarikan pesanan. Ada permintaan terbuka untuk perubahan yang juga sedikit menonjolkan latar belakang tetapi sepertinya produk tidak akan diubah untuk mempertahankan pesanan dokumen input:
- https://jira.mongodb.org/browse/SERVER-24799
- https://jira.mongodb.org/browse/SERVER-4507
- https://jira.mongodb.org/browse/SERVER-21022
Ada dua hal yang dapat dikatakan secara umum:Anda umumnya ingin mengelompokkan terlebih dahulu dan kemudian melakukan penyortiran. Alasannya karena menyortir lebih sedikit elemen (yang biasanya dihasilkan oleh pengelompokan) akan lebih cepat daripada menyortir semua dokumen masukan.
Kedua, MongoDB akan memastikan untuk menyortir seefisien dan sesedikit mungkin. Dokumentasi menyatakan:
Jadi kode ini menyelesaikan pekerjaan dalam kasus Anda:
collection.aggregate({
$group: {
_id: '$age',
names: { $push: '$name' }
}
}, {
$sort: {
'_id': 1
}
}, {
$limit: 10
})
EDIT mengikuti komentar Anda:
Saya setuju dengan apa yang Anda katakan. Dan mengambil logika Anda sedikit lebih jauh, saya akan mengatakan:Jika $group
cukup pintar untuk menggunakan indeks maka seharusnya tidak memerlukan $sort
panggung di awal. Sayangnya, tidak (belum mungkin). Seperti yang terjadi hari ini, $group
tidak akan pernah menggunakan indeks dan tidak akan mengambil jalan pintas berdasarkan tahapan berikut ($limit
pada kasus ini). Lihat juga tautan
ini tempat seseorang menjalankan beberapa tes dasar.
Kerangka kerja agregasi masih cukup muda, jadi saya rasa, ada banyak pekerjaan yang harus dilakukan untuk membuat alur agregasi lebih cerdas dan lebih cepat.
Ada jawaban di sini di StackOverflow (mis. di sini
) di mana orang menyarankan untuk menggunakan $sort
. di muka panggung untuk "memaksa" MongoDB menggunakan indeks entah bagaimana. Namun ini, memperlambat pengujian saya (1 juta catatan bentuk sampel Anda menggunakan distribusi acak yang berbeda) secara signifikan.
Dalam hal kinerja pipa agregasi, $match
tahapan di awal adalah yang paling membantu. Jika Anda dapat membatasi jumlah total catatan yang harus melalui jalur pipa dari awal, maka itu adalah pilihan terbaik Anda - tentu saja...;)