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

Hitung nilai lewati untuk catatan yang diberikan untuk paging yang diurutkan

Ini disebut "forward paging" yang merupakan konsep yang dapat Anda gunakan untuk "mengefisienkan halaman" melalui hasil ke arah "maju" saat menggunakan hasil "diurutkan".

Logika JavaScript disertakan (karena berfungsi di shell), tetapi tidak sulit untuk diterjemahkan.

Konsep secara umum:

{ "_id": 1, "a": 3 },
{ "_id": 2, "a": 3 },
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }

Pertimbangkan dokumen "yang sudah diurutkan" (untuk kenyamanan) sebagai contoh hasil yang ingin kami "halaman" dengan "dua" item per halaman.

Pada contoh pertama Anda melakukan sesuatu seperti ini:

var lastVal = null,
    lastSeen = [];

db.collection.find().sort({ "a": -1 }).limit(2).forEach(function(doc) {
    if ( lastVal != doc.a ) {
        lastSeen = [];
    }
    lastVal = doc.a;
    lastSeen.push( doc._id );
    // do something useful with each document matched
});

Sekarang lastVal dan lastSeen adalah sesuatu yang Anda simpan dalam sesuatu seperti "variabel sesi" daripada yang dapat diakses pada permintaan berikutnya dalam hal aplikasi web, atau sesuatu yang serupa jika tidak.

Apa yang seharusnya ada di dalamnya adalah nilai terakhir yang Anda urutkan dan daftar _id "unik" nilai yang terlihat karena nilai tersebut tidak berubah. Oleh karena itu:

lastVal = 3,
lastSeen = [1,2];

Intinya adalah ketika permintaan untuk "halaman berikutnya" muncul maka Anda ingin menggunakan variabel tersebut untuk sesuatu seperti ini:

var lastVal = 3,
    lastSeen = [1,2];

db.collection.find({ 
    "_id": { "$nin": lastSeen }, 
    "a": { "$lte": lastVal }
}).sort({ "a": -1 }).limit(2).forEach(function(doc) {
    if ( lastVal != doc.a ) {
        lastSeen = [];
    }
    lastVal = doc.a;
    lastSeen.push( doc._id );
    // do something useful with each document matched
});

Apa yang dilakukan adalah "mengecualikan" semua nilai _id yang direkam di lastSeen dari daftar hasil, serta pastikan bahwa semua hasil harus "kurang dari atau sama dengan" ( urutan menurun ) lastVal direkam untuk bidang sortir "a".

Ini menghasilkan dua hasil berikutnya dalam koleksi:

{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },

Tapi setelah diproses nilai kita sekarang terlihat seperti ini:

lastVal = 2,
lastSeen = [4];

Jadi sekarang logikanya mengikuti bahwa Anda tidak perlu mengecualikan _id lainnya nilai yang terlihat sebelumnya karena Anda hanya benar-benar mencari nilai "a" daripada "kurang dari atau sama dengan" lastVal dan karena hanya ada "satu" _id nilai yang terlihat pada nilai itu maka hanya mengecualikan yang itu.

Ini tentu saja menghasilkan halaman berikutnya tentang penggunaan kode yang sama seperti di atas:

{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }

Itu adalah cara paling efisien untuk "meneruskan halaman" melalui hasil secara umum dan sangat berguna untuk paging yang efisien dari hasil yang "diurutkan".

Namun jika Anda ingin "melompat" ke halaman 20 atau tindakan serupa pada tahap apa pun maka ini bukan untuk Anda. Anda terjebak dengan .skip() tradisional dan .limit() pendekatan untuk dapat melakukan ini dengan "nomor halaman" karena tidak ada cara rasional lain untuk "menghitung" ini.

Jadi semuanya tergantung pada bagaimana aplikasi Anda mengimplementasikan "paging" dan dengan apa Anda bisa hidup. .skip() dan .limit() pendekatan mengalami kinerja "melewati" dan dapat dihindari dengan menggunakan pendekatan di sini.

Di sisi lain, jika Anda ingin "lompat ke halaman" maka "melompati" adalah satu-satunya pilihan nyata Anda kecuali jika Anda ingin membuat "cache" hasil. Tapi itu masalah lain.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa mengubah ukuran koleksi yang dibatasi mongodb tanpa kehilangan data?

  2. Bagaimana Anda menggunakan Mongoose tanpa mendefinisikan skema?

  3. Dapatkan posisi dokumen yang dipilih dalam koleksi [mongoDB]

  4. gangguan mongoDB pada array

  5. Apakah menerapkan indeks 2dsphere pada skema luwak memaksa bidang lokasi diperlukan?