MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Was ist ein Cursor in MongoDB?

Hier ist ein Vergleich zwischen toArray() und Cursor nach einem find() im MongoDB-Treiber von Node.js. Allgemeiner 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 ist das toArray() Code, der in den obigen Abschnitt gehört.

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

Gemäß der Dokumentation

Der Aufrufer ist dafür verantwortlich sicherzustellen, dass genügend Speicherplatz zum Speichern der Ergebnisse vorhanden ist.

Hier ist der Cursor-basierte Ansatz mit 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();
        }
    );
});

Mit dem forEach() Anstatt alle Daten im Speicher abzurufen, streamen wir die Daten zu unserer Anwendung. find() erstellt sofort einen Cursor, da er keine Anfrage an die Datenbank stellt, bis wir versuchen, einige der bereitgestellten Dokumente zu verwenden. Der Punkt von cursor soll unsere Anfrage beschreiben. Der zweite Parameter für cursor.forEach zeigt, was zu tun ist, wenn ein Fehler auftritt.

In der ursprünglichen Version des obigen Codes war es toArray() was den Datenbankaufruf erzwang. Das bedeutete, dass wir ALLE brauchten die Dokumente und wollte sie in einem array haben .

Beachten Sie, dass MongoDB gibt Daten in Stapeln zurück. Das folgende Bild zeigt Anfragen von Cursorn (von der Anwendung) an MongoDB :

forEach skaliert besser als toArray weil wir Dokumente wie sie eingehen verarbeiten können bis wir das Ende erreichen. Vergleichen Sie es mit toArray - wo wir auf ALLE warten die abzurufenden Dokumente und das gesamte Array aufgebaut. Das bedeutet, dass wir keinen Vorteil aus der Tatsache ziehen, dass der Treiber und das Datenbanksystem zusammenarbeiten, um Ergebnisse per Batch für Ihre Anwendung bereitzustellen. Batching soll Effizienz in Bezug auf den Speicher-Overhead und die Ausführungszeit bieten. Nutzen Sie es in Ihrer Bewerbung, wenn Sie können.