Zde je srovnání mezi toArray()
a kurzory za find()
v ovladači Node.js MongoDB. Běžný kód:
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
});
Zde je toArray()
kód, který je uveden v sekci výše.
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();
});
Podle dokumentace
Volající je odpovědný za ujištění, že je k dispozici dostatek paměti pro uložení výsledků.
Zde je přístup založený na kurzoru pomocí cursor.forEach()
metoda:
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();
}
);
});
Pomocí forEach()
místo načítání všech dat v paměti, streamujeme data do naší aplikace. find()
vytvoří kurzor okamžitě, protože ve skutečnosti nevyvolá požadavek na databázi, dokud se nepokusíme použít některé dokumenty, které poskytne. Bod cursor
je popsat náš dotaz. Druhý parametr cursor.forEach
ukazuje, co dělat, když dojde k chybě.
V počáteční verzi výše uvedeného kódu to bylo toArray()
což si vynutilo volání databáze. Znamenalo to, že potřebujeme VŠECHNY dokumenty a chtěl, aby byly v array
.
Všimněte si, že MongoDB
vrací data v dávkách. Obrázek níže ukazuje požadavky z kurzorů (z aplikace) na MongoDB
:
forEach
měří lépe než toArray
protože dokumenty můžeme zpracovávat tak jak přicházejí dokud nedojdeme na konec. Porovnejte to s toArray
- kde čekáme na VŠECHNY dokumenty k načtení a celý pole je postaveno. To znamená, že nezískáme žádnou výhodu ze skutečnosti, že ovladač a databázový systém spolupracují na dávkovém zpracování výsledků do vaší aplikace. Dávkování má zajistit efektivitu, pokud jde o režii paměti a dobu provádění. Pokud můžete, využijte toho ve své aplikaci.