Ето сравнение между toArray()
и курсори след find()
в драйвера на Node.js MongoDB. Общ код:
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
});
Ето toArray()
код, който се намира в раздела по-горе.
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();
});
Според документацията,
Обаждащият се е отговорен да се увери, че има достатъчно памет за съхраняване на резултатите.
Ето подхода, базиран на курсора, използващ cursor.forEach()
метод:
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();
}
);
});
С forEach()
подход, вместо да извличаме всички данни в паметта, ние предаваме данните към нашето приложение. find()
създава курсор веднага, защото всъщност не прави заявка към базата данни, докато не се опитаме да използваме някои от документите, които ще предостави. Точката на cursor
е да опишем нашето запитване. Вторият параметър за cursor.forEach
показва какво да направите, когато възникне грешка.
В първоначалната версия на горния код беше toArray()
което принуди извикването на базата данни. Това означаваше, че имаме нужда от ВСИЧКИ документите и исках те да бъдат в array
.
Имайте предвид, че MongoDB
връща данни в пакети. Изображението по-долу показва заявки от курсори (от приложение) към MongoDB
:
forEach
мащабира по-добре от toArray
защото можем да обработваме документи при постъпване докато стигнем до края. Сравнете го с toArray
- където чакаме заВСИЧКИ документите, които трябва да бъдат изтеглени, и цилото масивът е изграден. Това означава, че не получаваме никакво предимство от факта, че драйверът и системата на базата данни работят заедно, за да изпращат резултати към вашето приложение. Групирането има за цел да осигури ефективност по отношение на режийната памет и времето за изпълнение. Възползвайте се от това в приложението си, ако можете.