sql >> データベース >  >> NoSQL >> MongoDB

MongoDBのカーソルとは何ですか?

    toArray()の比較は次のとおりです。 find()の後のカーソル Node.jsMongoDBドライバーで。一般的なコード:

    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の2番目のパラメーター エラーが発生した場合の対処方法を示します。

    上記のコードの初期バージョンでは、toArray()でした。 これにより、データベースの呼び出しが強制されました。つまり、すべてが必要でした ドキュメントをarrayに配置する必要がありました 。

    MongoDBに注意してください データをバッチで返します。以下の画像は、カーソル(アプリケーションから)からMongoDBへのリクエストを示しています :

    forEach toArrayよりも優れたスケーリング 入ってきたドキュメントを処理できるため 終わりに達するまで。 toArrayと比較してください -すべてを待つ場所 取得するドキュメントと全体 アレイが構築されます。これは、ドライバーとデータベースシステムが連携して結果をアプリケーションにバッチ処理しているという事実から、何の利点も得られていないことを意味します。バッチ処理は、メモリのオーバーヘッドと実行時間の観点から効率を提供することを目的としています。 可能であれば、アプリケーションでそれを利用してください。



    1. mongoは配列データをアップサートできますか?

    2. mongodb:存在しない場合は挿入

    3. RedisとNode.jsおよびSocket.ioの質問

    4. 高可用性のためにOpenedXMongoDBデータベースをデプロイする方法