Hier is een vergelijking tussen toArray()
en cursors na een find()
in het Node.js MongoDB-stuurprogramma. Algemene code:
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
});
Hier is de toArray()
code die in het gedeelte hierboven staat.
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();
});
Volgens de documentatie,
De beller is verantwoordelijk om ervoor te zorgen dat er voldoende geheugen is om de resultaten op te slaan.
Hier is de op de cursor gebaseerde benadering, met behulp van de cursor.forEach()
methode:
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();
}
);
});
Met de forEach()
aanpak, in plaats van alle gegevens in het geheugen op te halen, streamen we de gegevens naar onze applicatie. find()
creëert onmiddellijk een cursor omdat deze niet echt een verzoek doet aan de database totdat we proberen enkele van de documenten te gebruiken die hij zal leveren. Het punt van cursor
is om onze vraag te beschrijven. De tweede parameter voor cursor.forEach
laat zien wat te doen als er een fout optreedt.
In de eerste versie van de bovenstaande code was dit toArray()
die de database-aanroep dwong. Het betekende dat we ALLE . nodig hadden de documenten en wilde dat ze in een array
.
Merk op dat MongoDB
retourneert gegevens in batches. De afbeelding hieronder toont verzoeken van cursors (van applicatie) naar MongoDB
:
forEach
schaalt beter dan toArray
omdat we documenten kunnen verwerken zoals ze binnenkomen totdat we het einde bereiken. Vergelijk het met toArray
- waar we wachten op ALLE de documenten die moeten worden opgehaald en de gehele array is opgebouwd. Dit betekent dat we geen voordeel halen uit het feit dat de driver en het databasesysteem samenwerken om de resultaten naar uw applicatie te batchen. Batching is bedoeld om efficiëntie te bieden in termen van geheugenoverhead en de uitvoeringstijd. Profiteer er indien mogelijk van in uw aanvraag.