sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvad er en markør i MongoDB?

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.



  1. Stream fra en mongodb-markør til Express-svar i node.js

  2. MongoDB:Hvordan får man en særskilt liste over underdokumentfeltværdier?

  3. MongoDB 'count()' er meget langsom. Hvordan forfiner/arbejder vi med det?

  4. Mongo Find()-funktionen vil ikke udelukke _id