sql >> Database >  >> NoSQL >> MongoDB

Wat is een cursor in MongoDB?

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.



  1. Map/reduce gebruiken om de eigenschappen in een collectie in kaart te brengen

  2. Hoe documenten uit te sluiten van zoekresultaten met velden die niet aanwezig zijn in de zoekopdracht?

  3. Een-een- en een-veel-referenties verwijderen - Mongoose

  4. Redis Cross Slot-fout