sql >> Databáze >  >> NoSQL >> MongoDB

Co je to kurzor v MongoDB?

Zde je srovnání mezi toArray() a kurzory za find() v ovladači Node.js MongoDB. Běžný kód:

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

Zde je toArray() kód, který je uveden v sekci výše.

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

Podle dokumentace

Volající je odpovědný za ujištění, že je k dispozici dostatek paměti pro uložení výsledků.

Zde je přístup založený na kurzoru pomocí cursor.forEach() metoda:

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

Pomocí forEach() místo načítání všech dat v paměti, streamujeme data do naší aplikace. find() vytvoří kurzor okamžitě, protože ve skutečnosti nevyvolá požadavek na databázi, dokud se nepokusíme použít některé dokumenty, které poskytne. Bod cursor je popsat náš dotaz. Druhý parametr cursor.forEach ukazuje, co dělat, když dojde k chybě.

V počáteční verzi výše uvedeného kódu to bylo toArray() což si vynutilo volání databáze. Znamenalo to, že potřebujeme VŠECHNY dokumenty a chtěl, aby byly v array .

Všimněte si, že MongoDB vrací data v dávkách. Obrázek níže ukazuje požadavky z kurzorů (z aplikace) na MongoDB :

forEach měří lépe než toArray protože dokumenty můžeme zpracovávat tak jak přicházejí dokud nedojdeme na konec. Porovnejte to s toArray - kde čekáme na VŠECHNY dokumenty k načtení a celý pole je postaveno. To znamená, že nezískáme žádnou výhodu ze skutečnosti, že ovladač a databázový systém spolupracují na dávkovém zpracování výsledků do vaší aplikace. Dávkování má zajistit efektivitu, pokud jde o režii paměti a dobu provádění. Pokud můžete, využijte toho ve své aplikaci.



  1. Redis:Součet SKÓRE v tříděné sadě

  2. Odkazování na jiné schéma v Mongoose

  3. _http_server.js:192 throw new RangeError(`Neplatný stavový kód:${statusCode}`);

  4. $unset na více polích v mongodb