Saya menulis webapp dengan Node.js dan luwak. Bagaimana saya bisa memberi nomor hasil yang saya dapatkan dari .find()
panggilan telepon? Saya ingin fungsionalitas yang sebanding dengan "LIMIT 50,100"
di SQL.
mongodb
node.js
pagination
mongoose
Thomas
sumber
sumber
Jawaban:
Saya sangat kecewa dengan jawaban yang diterima dalam pertanyaan ini. Ini tidak akan skala. Jika Anda membaca tulisan kecil di cursor.skip ():
Untuk mencapai pagination dengan cara yang dapat dikombinasi, gabungkan batas () bersama dengan setidaknya satu kriteria filter, tanggal yang dibuat sesuai dengan banyak tujuan.
sumber
-createdOn
', Anda akan mengganti nilairequest.createdOnBefore
dengan nilai paling sedikit daricreatedOn
pengembalian di set hasil sebelumnya, dan kemudian meminta kembali.Setelah melihat lebih dekat pada API Mongoose dengan informasi yang diberikan oleh Rodolphe, saya menemukan solusi ini:
sumber
Pagination menggunakan luwak, express, dan jade - Inilah tautan ke blog saya dengan lebih detail
sumber
Math.max(0, undefined)
akan kembaliundefined
, Ini bekerja untuk saya:let limit = Math.abs(req.query.limit) || 10;
let page = (Math.abs(req.query.page) || 1) - 1;
Schema.find().limit(limit).skip(limit * page)
Anda dapat rantai seperti itu:
Jalankan permintaan menggunakan
exec
sumber
var page = req.param('p'); var per_page = 10; if (page == null) { page = 0; } Location.count({}, function(err, count) { Location.find({}).skip(page*per_page).limit(per_page).execFind(function(err, locations) { res.render('index', { locations: locations }); }); });
Dalam hal ini, Anda dapat menambahkan kueri
page
dan / ataulimit
ke URL Anda sebagai string kueri.Sebagai contoh:
?page=0&limit=25 // this would be added onto your URL: http:localhost:5000?page=0&limit=25
Karena itu akan menjadi,
String
kita perlu mengubahnya menjadiNumber
untuk perhitungan kita. Mari kita lakukan dengan menggunakanparseInt
metode dan mari kita juga memberikan beberapa nilai default.BTW Pagination dimulai dengan
0
sumber
mongoose
.Anda dapat menggunakan paket kecil yang disebut Mongoose Paginate yang membuatnya lebih mudah.
Setelah di rute atau pengontrol Anda, cukup tambahkan:
sumber
Ini adalah contoh contoh yang dapat Anda coba ini,
sumber
Coba gunakan fungsi luwak untuk pagination. Batas adalah jumlah catatan per halaman dan jumlah halaman.
sumber
Inilah yang saya lakukan pada kode
Begitulah cara saya melakukannya.
sumber
count()
sudah ditinggalkan. gunakancountDocuments()
Pertanyaan;
search = productName,
Params;
halaman = 1
sumber
Ini adalah versi yang saya lampirkan ke semua model saya. Itu tergantung pada garis bawah untuk kenyamanan dan async untuk kinerja. Pilihan memungkinkan untuk pemilihan bidang dan penyortiran menggunakan sintaks luwak.
Lampirkan ke skema model Anda.
sumber
Solusi pagination sederhana dan kuat
last_doc_id
: id dokumen terakhir yang Anda dapatkanno_of_docs_required
: jumlah dokumen yang ingin Anda ambil yaitu 5, 10, 50 dll.last_doc_id
metode tersebut, Anda akan mendapatkan 5 dokumen terbarulast_doc_id
maka Anda akan mendapatkan 5 dokumen berikutnya yaitu.sumber
Jawaban di atas bagus.
sumber
Anda dapat menggunakan baris kode berikut juga
kode ini akan berfungsi dalam versi mongo terbaru
sumber
Pendekatan yang solid untuk mengimplementasikan ini adalah untuk melewatkan nilai-nilai dari frontend menggunakan string kueri . Katakanlah kita ingin mendapatkan halaman # 2 dan juga membatasi output hingga 25 hasil .
String kueri akan terlihat seperti ini:
?page=2&limit=25 // this would be added onto your URL: http:localhost:5000?page=2&limit=25
Mari kita lihat kodenya:
Saya akan menyarankan mengimplementasikan logika ini ke middleware sehingga Anda dapat menggunakannya untuk berbagai rute / pengontrol.
sumber
Cara termudah dan lebih cepat adalah, paginasi dengan objectId Contoh;
Kondisi muatan awal
Ambil ObjectId pertama dan terakhir dari data respons
Halaman kondisi selanjutnya
Halaman kondisi selanjutnya
Pada luwak
sumber
Pendekatan terbaik (IMO) adalah menggunakan lewati dan batasi BUT dalam koleksi atau dokumen terbatas.
Untuk membuat kueri dalam dokumen terbatas, kita bisa menggunakan indeks seperti indeks tertentu pada bidang tipe DATE. Lihat itu di bawah
sumber
Plugin paling mudah untuk pagination.
https://www.npmjs.com/package/mongoose-paginate-v2
Tambahkan plugin ke skema dan kemudian gunakan metode model paginate:
sumber
Ini adalah contoh fungsi untuk mendapatkan hasil model keterampilan dengan opsi pagination dan limit
}
sumber
Anda dapat menulis kueri seperti ini.
halaman: nomor halaman yang berasal dari klien sebagai parameter permintaan.
per_page: tidak ada hasil yang ditampilkan per halaman
Jika Anda menggunakan tumpukan MEAN setelah posting blog menyediakan banyak informasi untuk membuat pagination di ujung depan menggunakan bootstrap sudut-UI dan menggunakan metode lompat jauh dan batas luak di backend.
lihat: https://techpituwa.wordpress.com/2015/06/06/mean-js-pagination-with-angular-ui-bootstrap/
sumber
Anda dapat menggunakan skip () dan limit (), tetapi sangat tidak efisien. Solusi yang lebih baik akan menjadi semacam bidang diindeks plus batas (). Kami di Wunderflats telah menerbitkan lib kecil di sini: https://github.com/wunderflats/goosepage Ini menggunakan cara pertama.
sumber
Jika Anda menggunakan luwak sebagai sumber api yang nyenyak, lihat ' restify-luwak' ' dan pertanyaannya. Ini persis memiliki fungsi ini bawaan.
Setiap kueri pada koleksi memberikan tajuk yang bermanfaat di sini
Jadi pada dasarnya Anda mendapatkan server generik dengan waktu buka yang relatif linier untuk kueri ke koleksi. Itu luar biasa dan sesuatu untuk dilihat jika Anda ingin pergi ke implementasi sendiri.
sumber
sumber
sumber
Gunakan plugin sederhana ini.
https://github.com/WebGangster/mongoose-paginate-v2
Instalasi
sumber
berdasarkan
menjawab:
sumber
Menggunakan ts-luwak-pagination
sumber
sumber
Mampu mencapai hasil dengan async / menunggu juga.
Contoh kode di bawah ini menggunakan async handler dengan hapi v17 dan luoose v5
sumber