Her er en sammenligning mellem toArray()
og markører efter en find()
i Node.js MongoDB-driveren. Fælles kode:
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
});
Her er toArray()
kode, der går i afsnittet ovenfor.
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();
});
Ifølge dokumentationen,
Den, der ringer, er ansvarlig for at sikre, at der er nok hukommelse til at gemme resultaterne.
Her er den markørbaserede tilgang, der bruger cursor.forEach()
metode:
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();
}
);
});
Med forEach()
tilgang, i stedet for at hente alle data i hukommelsen, streamer vi dataene til vores applikation. find()
opretter en markør med det samme, fordi den faktisk ikke sender en anmodning til databasen, før vi forsøger at bruge nogle af de dokumenter, den vil levere. Punktet for cursor
er at beskrive vores forespørgsel. Den anden parameter til cursor.forEach
viser, hvad du skal gøre, når der opstår en fejl.
I den oprindelige version af ovenstående kode var det toArray()
hvilket tvang databasekaldet. Det betød, at vi havde brug for ALLE dokumenterne og ønskede, at de skulle være i et array
.
Bemærk, at MongoDB
returnerer data i batches. Billedet nedenfor viser anmodninger fra markører (fra applikation) til MongoDB
:
forEach
skaleres bedre end toArray
fordi vi kan behandle dokumenter efterhånden som de kommer ind indtil vi når enden. Kontrast det med toArray
- hvor vi venter på ALLE de dokumenter, der skal hentes og hele array er bygget. Det betyder, at vi ikke får nogen fordel af, at driveren og databasesystemet arbejder sammen om at batch resultater til din applikation. Batching er beregnet til at give effektivitet i form af hukommelsesomkostninger og udførelsestid. Udnyt det i din ansøgning, hvis du kan.