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

nodejsで、mongodb呼び出しが返されるまでFORループを停止する方法

    " async "は、非同期ループを抽象化し、コードを読みやすく/保守しやすくするための非常に人気のあるモジュールです。例:

    var async = require('async');
    
    function getHonorStudentsFrom(stuObjList, callback) {
    
        var honorStudents = [];
    
        // The 'async.forEach()' function will call 'iteratorFcn' for each element in
        // stuObjList, passing a student object as the first param and a callback
        // function as the second param. Run the callback to indicate that you're
        // done working with the current student object. Anything you pass to done()
        // is interpreted as an error. In that scenario, the iterating will stop and
        // the error will be passed to the 'doneIteratingFcn' function defined below.
        var iteratorFcn = function(stuObj, done) {
    
            // If the current student object doesn't have the 'honor_student' property
            // then move on to the next iteration.
            if( !stuObj.honor_student ) {
                done();
                return; // The return statement ensures that no further code in this
                        // function is executed after the call to done(). This allows
                        // us to avoid writing an 'else' block.
            }
    
            db.collection("students").findOne({'_id' : stuObj._id}, function(err, honorStudent)
            {
                if(err) {
                    done(err);
                    return;
                }
    
                honorStudents.push(honorStudent);
                done();
                return;
            });
        };
    
        var doneIteratingFcn = function(err) {
            // In your 'callback' implementation, check to see if err is null/undefined
            // to know if something went wrong.
            callback(err, honorStudents);
        };
    
        // iteratorFcn will be called for each element in stuObjList.
        async.forEach(stuObjList, iteratorFcn, doneIteratingFcn);
    }
    

    したがって、次のように使用できます:

    getHonorStudentsFrom(studentObjs, function(err, honorStudents) {
        if(err) {
          // Handle the error
          return;
        }
    
        // Do something with honroStudents
    });
    

    .forEach() に注意してください stuObjList内の各要素のイテレータ関数を「並列に」呼び出します(つまり、1つのイテレータ関数が1つの配列要素に対して呼び出され終わるのを待たずに、次の配列要素で呼び出します)。これは、イテレータ関数(またはさらに重要なことにデータベース呼び出し)が実行される順序を実際に予測できないことを意味します。最終結果:名誉学生の予測できない順序。順序が重要な場合は、 .forEachSeries() を使用してください 機能。



    1. docker-compose:コンテナ間の接続は拒否されましたが、ホストからサービスにアクセスできます

    2. ClusterControlを補完するコミュニティのMongoDBツール

    3. BSONタイプObjectIdをJSONに変換する(Mongodbに保存)-Java

    4. Mongoアグリゲーションフレームワーク:最終段階の$ out操作のロックレベルはどれくらいですか?