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

Che cos'è un cursore in MongoDB?

Ecco un confronto tra toArray() e cursori dopo un find() nel driver MongoDB di Node.js. Codice comune:

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

Ecco il toArray() codice che va nella sezione sopra.

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

Secondo la documentazione,

Il chiamante è responsabile di assicurarsi che ci sia memoria sufficiente per memorizzare i risultati.

Ecco l'approccio basato sul cursore, utilizzando cursor.forEach() metodo:

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

Con forEach() approccio, invece di recuperare tutti i dati in memoria, stiamo trasmettendo i dati alla nostra applicazione. find() crea immediatamente un cursore perché in realtà non effettua una richiesta al database finché non proviamo a utilizzare alcuni dei documenti che fornirà. Il punto del cursor è descrivere la nostra domanda. Il secondo parametro per cursor.forEach mostra cosa fare quando si verifica un errore.

Nella versione iniziale del codice precedente, era toArray() che ha forzato la chiamata al database. Significava che avevamo bisogno di TUTTI i documenti e voleva che fossero in un array .

Nota che MongoDB restituisce i dati in batch. L'immagine sotto mostra le richieste dai cursori (dall'applicazione) a MongoDB :

forEach scala meglio di toArray perché possiamo elaborare i documenti non appena arrivano fino a raggiungere la fine. Confrontalo con toArray - dove aspettiamo TUTTI i documenti da recuperare e il intero l'array è costruito. Ciò significa che non stiamo ottenendo alcun vantaggio dal fatto che il driver e il sistema di database stanno lavorando insieme per raggruppare i risultati nell'applicazione. Il batch ha lo scopo di fornire efficienza in termini di sovraccarico di memoria e tempo di esecuzione. Sfruttalo nella tua applicazione, se puoi.