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.