MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Qu'est-ce qu'un curseur dans MongoDB ?

Voici une comparaison entre toArray() et les curseurs après un find() dans le pilote Node.js MongoDB. Code commun :

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

Voici le toArray() code qui va dans la section ci-dessus.

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

Selon la documentation,

L'appelant est responsable de s'assurer qu'il y a suffisamment de mémoire pour stocker les résultats.

Voici l'approche basée sur le curseur, en utilisant le cursor.forEach() méthode :

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

Avec le forEach() approche, au lieu de récupérer toutes les données en mémoire, nous diffusons les données vers notre application. find() crée un curseur immédiatement car il ne fait pas de demande à la base de données tant que nous n'essayons pas d'utiliser certains des documents qu'il fournira. Le point du cursor est de décrire notre requête. Le deuxième paramètre de cursor.forEach montre ce qu'il faut faire lorsqu'une erreur se produit.

Dans la version initiale du code ci-dessus, c'était toArray() qui a forcé l'appel de la base de données. Cela signifiait que nous avions besoin de TOUS les documents et je voulais qu'ils soient dans un array .

Notez que MongoDB renvoie les données par lots. L'image ci-dessous montre les requêtes des curseurs (de l'application) à MongoDB :

forEach s'adapte mieux que toArray car nous pouvons traiter les documents au fur et à mesure qu'ils arrivent jusqu'à ce que nous arrivions à la fin. Comparez-le avec toArray - où nous attendons TOUS les documents à récupérer et l'intégralité tableau est construit. Cela signifie que nous ne tirons aucun avantage du fait que le pilote et le système de base de données travaillent ensemble pour regrouper les résultats dans votre application. Le traitement par lots est censé fournir une efficacité en termes de surcharge de mémoire et de temps d'exécution. Profitez-en dans votre candidature, si vous le pouvez.