Oto porównanie między toArray() i kursory po find() w sterowniku Node.js MongoDB. Wspólny kod:
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
});
Oto toArray() kod, który znajduje się w powyższej sekcji.
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();
});
Zgodnie z dokumentacją,
Dzwoniący jest odpowiedzialny za upewnienie się, że jest wystarczająco dużo pamięci do przechowywania wyników.
Oto podejście oparte na kursorze, przy użyciu 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();
}
);
});
Za pomocą forEach() Podejście, zamiast pobierać wszystkie dane z pamięci, przesyłamy dane do naszej aplikacji. find() tworzy kursor natychmiast, ponieważ w rzeczywistości nie wysyła żądania do bazy danych, dopóki nie spróbujemy użyć niektórych dokumentów, które dostarczy. Punkt cursor jest opisanie naszego zapytania. Drugi parametr cursor.forEach pokazuje, co zrobić, gdy wystąpi błąd.
W początkowej wersji powyższego kodu był to toArray() co wymusiło wywołanie bazy danych. Oznaczało to, że potrzebowaliśmy WSZYSTKICH dokumenty i chciał, aby były w array .
Zwróć uwagę, że MongoDB zwraca dane w partiach. Poniższy obrazek pokazuje żądania od kursorów (z aplikacji) do MongoDB :

forEach skaluje się lepiej niż toArray ponieważ możemy przetwarzać dokumenty tak, jak przychodzą do końca. Porównaj to z toArray - gdzie czekamy na WSZYSTKIE dokumenty do pobrania i całość budowana jest tablica. Oznacza to, że nie uzyskujemy żadnych korzyści z faktu, że sterownik i system bazy danych współpracują ze sobą, aby wsadowo przesyłać wyniki do aplikacji. Tworzenie partii ma na celu zapewnienie wydajności pod względem obciążenia pamięci i czasu wykonania. Wykorzystaj to w swojej aplikacji, jeśli możesz.