sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Qué es un cursor en MongoDB?

Aquí hay una comparación entre toArray() y cursores después de un find() en el controlador Node.js MongoDB. Código común:

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

Aquí está el toArray() código que va en la sección anterior.

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

Según la documentación,

La persona que llama es responsable de asegurarse de que haya suficiente memoria para almacenar los resultados.

Aquí está el enfoque basado en el cursor, usando el cursor.forEach() método:

    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() enfoque, en lugar de obtener todos los datos en la memoria, estamos transmitiendo los datos a nuestra aplicación. find() crea un cursor inmediatamente porque en realidad no realiza una solicitud a la base de datos hasta que intentamos usar algunos de los documentos que proporcionará. El punto del cursor es describir nuestra consulta. El segundo parámetro para cursor.forEach muestra qué hacer cuando ocurre un error.

En la versión inicial del código anterior, era toArray() lo que forzó la llamada a la base de datos. Significaba que necesitábamos TODO los documentos y quería que estuvieran en una array .

Tenga en cuenta que MongoDB devuelve datos en lotes. La siguiente imagen muestra las solicitudes de los cursores (de la aplicación) a MongoDB :

forEach escala mejor que toArray porque podemos procesar documentos tal como llegan hasta llegar al final. Compáralo con toArray - donde esperamos a TODOS los documentos a recuperar y la totalidad se construye la matriz. Esto significa que no obtenemos ninguna ventaja del hecho de que el controlador y el sistema de la base de datos trabajen juntos para enviar resultados por lotes a su aplicación. El procesamiento por lotes está destinado a proporcionar eficiencia en términos de sobrecarga de memoria y tiempo de ejecución. Aprovéchalo en tu aplicación, si puedes.