MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Какво е курсор в MongoDB?

Ето сравнение между toArray() и курсори след find() в драйвера на Node.js MongoDB. Общ код:

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

Ето toArray() код, който се намира в раздела по-горе.

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

Според документацията,

Обаждащият се е отговорен да се увери, че има достатъчно памет за съхраняване на резултатите.

Ето подхода, базиран на курсора, използващ cursor.forEach() метод:

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

С forEach() подход, вместо да извличаме всички данни в паметта, ние предаваме данните към нашето приложение. find() създава курсор веднага, защото всъщност не прави заявка към базата данни, докато не се опитаме да използваме някои от документите, които ще предостави. Точката на cursor е да опишем нашето запитване. Вторият параметър за cursor.forEach показва какво да направите, когато възникне грешка.

В първоначалната версия на горния код беше toArray() което принуди извикването на базата данни. Това означаваше, че имаме нужда от ВСИЧКИ документите и исках те да бъдат в array .

Имайте предвид, че MongoDB връща данни в пакети. Изображението по-долу показва заявки от курсори (от приложение) към MongoDB :

forEach мащабира по-добре от toArray защото можем да обработваме документи при постъпване докато стигнем до края. Сравнете го с toArray - където чакаме заВСИЧКИ документите, които трябва да бъдат изтеглени, и цилото масивът е изграден. Това означава, че не получаваме никакво предимство от факта, че драйверът и системата на базата данни работят заедно, за да изпращат резултати към вашето приложение. Групирането има за цел да осигури ефективност по отношение на режийната памет и времето за изпълнение. Възползвайте се от това в приложението си, ако можете.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Преведете Queryable<T> обратно към IMongoQuery

  2. Намерете стойности, които не съдържат числа в SQL

  3. Обединяване на връзка с база данни на драйвери на MongoDB с Tomcat

  4. Атомарност, изолация и паралелност в MongoDB

  5. Как да премахнете поле от документ на MongoDB ($unset)