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

Node.jsを使用してMongoDBでcursor.forEach()を使用するにはどうすればよいですか?

    答えは、使用しているドライバーによって異なります。私が知っているすべてのMongoDBドライバーにはcursor.forEach()があります 何らかの方法で実装されました。

    次にいくつかの例を示します。

    node-mongodb-native

    collection.find(query).forEach(function(doc) {
      // handle
    }, function(err) {
      // done or error
    });
    

    mongojs

    db.collection.find(query).forEach(function(err, doc) {
      // handle
    });
    

    僧侶

    collection.find(query, { stream: true })
      .each(function(doc){
        // handle doc
      })
      .error(function(err){
        // handle error
      })
      .success(function(){
        // final callback
      });
    

    マングース

    collection.find(query).stream()
      .on('data', function(doc){
        // handle doc
      })
      .on('error', function(err){
        // handle error
      })
      .on('end', function(){
        // final callback
      });
    

    .forEach内のドキュメントを更新しています コールバック

    .forEach内のドキュメントを更新する際の唯一の問題 コールバックは、すべてのドキュメントがいつ更新されるかわからないということです。

    この問題を解決するには、非同期制御フローソリューションを使用する必要があります。いくつかのオプションがあります:

    • 非同期
    • 約束(when.js、bluebird)

    asyncの使用例を次に示します。 、queueを使用 機能:

    var q = async.queue(function (doc, callback) {
      // code for your update
      collection.update({
        _id: doc._id
      }, {
        $set: {hi: 'there'}
      }, {
        w: 1
      }, callback);
    }, Infinity);
    
    var cursor = collection.find(query);
    cursor.each(function(err, doc) {
      if (err) throw err;
      if (doc) q.push(doc); // dispatching doc to async.queue
    });
    
    q.drain = function() {
      if (cursor.isClosed()) {
        console.log('all items have been processed');
        db.close();
      }
    }
    


    1. ZookeeperとIn-memory-data-gridとRedis

    2. MongoDB埋め込みオブジェクトにはIDがありません(null値)

    3. SpringDataMongoDBのGridFS

    4. ダンプされたデータをmongodumpで使用するにはどうすればよいですか?