MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah mungkin untuk mengurutkan, mengelompokkan, dan membatasi secara efisien di Mongo dengan saluran pipa?

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:

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...;)




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tidak dapat terhubung ke MongoDB dengan otentikasi diaktifkan

  2. Cara mengaktifkan kueri MongoDB mentah langsung di Ruby

  3. desain skema mongodb untuk blog

  4. Mengapa saya mendapatkan argumen yang tidak dikenal ke dateFromString:'format' meskipun memiliki versi db>3.6 yang mendukung agregasi

  5. Simpan Subset Koleksi MongoDB ke Koleksi Lain