Berikut perbandingan antara toArray()
dan kursor setelah find()
di driver Node.js MongoDB. Kode umum:
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
MongoClient.connect('mongodb://localhost:27017/crunchbase', function (err, db) {
assert.equal(err, null);
console.log('Successfully connected to MongoDB.');
const query = { category_code: "biotech" };
// toArray() vs. cursor code goes here
});
Berikut toArray()
kode yang ada di bagian di atas.
db.collection('companies').find(query).toArray(function (err, docs) {
assert.equal(err, null);
assert.notEqual(docs.length, 0);
docs.forEach(doc => {
console.log(`${doc.name} is a ${doc.category_code} company.`);
});
db.close();
});
Sesuai dengan dokumentasi,
Penelepon bertanggung jawab untuk memastikan bahwa ada cukup memori untuk menyimpan hasil.
Berikut pendekatan berbasis kursor, menggunakan cursor.forEach()
metode:
const cursor = db.collection('companies').find(query);
cursor.forEach(
function (doc) {
console.log(`${doc.name} is a ${doc.category_code} company.`);
},
function (err) {
assert.equal(err, null);
return db.close();
}
);
});
Dengan forEach()
pendekatan, alih-alih mengambil semua data di memori, kami mengalirkan data ke aplikasi kami. find()
membuat kursor segera karena tidak membuat permintaan ke database sampai kami mencoba menggunakan beberapa dokumen yang akan disediakannya. Titik cursor
adalah untuk menggambarkan permintaan kami. Parameter kedua untuk cursor.forEach
menunjukkan apa yang harus dilakukan ketika terjadi kesalahan.
Pada versi awal dari kode di atas, adalah toArray()
yang memaksa panggilan database. Itu berarti kami membutuhkan SEMUA dokumen dan ingin mereka berada dalam array
.
Perhatikan bahwa MongoDB
mengembalikan data dalam batch. Gambar di bawah ini menunjukkan permintaan dari kursor (dari aplikasi) ke MongoDB
:
forEach
skala lebih baik daripada toArray
karena kami dapat memproses dokumen saat masuk sampai kita mencapai akhir. Bandingkan dengan toArray
- tempat kami menunggu SEMUA dokumen yang akan diambil dan seluruhnya array dibangun. Ini berarti kami tidak mendapatkan keuntungan apa pun dari fakta bahwa driver dan sistem database bekerja sama untuk mengelompokkan hasil ke aplikasi Anda. Batching dimaksudkan untuk memberikan efisiensi dalam hal overhead memori dan waktu eksekusi. Manfaatkan dalam aplikasi Anda, jika Anda bisa.