sql >> Databasteknik >  >> NoSQL >> MongoDB

Vad är en markör i MongoDB?

Här är en jämförelse mellan toArray() och markörer efter en find() i Node.js MongoDB-drivrutinen. Vanlig kod:

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
});

Här är toArray() kod som går i avsnittet ovan.

    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();
    });

Enligt dokumentationen,

Den som ringer är ansvarig för att se till att det finns tillräckligt med minne för att lagra resultaten.

Här är den markörbaserade metoden med cursor.forEach() metod:

    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() istället för att hämta all data i minnet, streamar vi data till vår applikation. find() skapar en markör omedelbart eftersom den faktiskt inte gör en begäran till databasen förrän vi försöker använda några av de dokument som den kommer att tillhandahålla. Punkten för cursor är att beskriva vår fråga. Den andra parametern till cursor.forEach visar vad man ska göra när ett fel uppstår.

I den ursprungliga versionen av ovanstående kod var det toArray() vilket tvingade fram databasanropet. Det innebar att vi behövde ALLA dokumenten och ville att de skulle vara i en array .

Observera att MongoDB returnerar data i omgångar. Bilden nedan visar förfrågningar från markörer (från applikation) till MongoDB :

forEach skalar bättre än toArray eftersom vi kan behandla dokument eftersom de kommer in tills vi når slutet. Jämför det med toArray - där vi väntar på ALLA dokumenten som ska hämtas och hela array är byggd. Det betyder att vi inte får någon fördel av att drivrutinen och databassystemet samarbetar för att batcha resultat till din applikation. Batchning är tänkt att ge effektivitet när det gäller minneskostnader och exekveringstiden. Utnyttja det i din ansökan om du kan.



  1. MapReduce med MongoDB riktigt, riktigt långsam (30 timmar mot 20 minuter i MySQL för en motsvarande databas)

  2. Jämför tecken på 64-bitars nummer med 32-bitars bitvisa operationer i Lua

  3. Hur man får Laravel att fungera med Redis kluster på AWS

  4. MongoDB deleteMany()