2016-12-22 6 views
1

を働いていないモンゴの検索操作がうまく動作するコードされています。今、私は「returndataは、検索クエリの結果である1つの以上の特性を持つべきである」ことを望ん予想通りの下

for(i=0;i<distinct_branch.length;i++){ 
        myobj = {} 
        myobj['branch'] = distinct_branch[i] 
        myobj['total_re'] = 0 
        myobj['present'] = 0 
        myobj['absent'] = 0 
        myobj['weekly_off'] = 0 
        myobj['leave'] = 0 
        myobj['total_marked'] = 0 
        myobj['pending_attend'] = 0 
        myobj['dat_compliance'] = 0 
        myobj['pending_dat_compliance'] = 0 
        for(j=0;j<results.length;j++){ 
         if(results[j].counter){ 
          if(results[j].counter.state){ 
           if(distinct_branch[i]==results[j].counter.state){ 
            myobj['total_re'] = myobj['total_re'] + 1 
            if(results[j].attendance == 'P') { 
             myobj['present'] = myobj['present'] + 1 
             myobj['total_marked'] = myobj['total_marked'] + 1 
            } 
            else{ 
             if(results[j].attendance == 'A') { 
              myobj['absent'] = myobj['absent'] + 1 
              myobj['total_marked'] = myobj['total_marked'] + 1 
             } 
             else{ 
              if(results[j].attendance == 'O') { 
               myobj['weekly_off'] = myobj['weekly_off'] + 1 
               myobj['total_marked'] = myobj['total_marked'] + 1 
              } 
              else{ 
               if(results[j].attendance == 'L') { 
                myobj['leave'] = myobj['leave'] + 1 
                myobj['total_marked'] = myobj['total_marked'] + 1 
               } 
               else{ 
                if(results[j].attendance == 'Pending') { 
                 myobj['pending_attend'] = myobj['pending_attend'] + 1 
                } 
               } 
              } 
             } 
            } 
            myobj['dat_compliance'] = (myobj['total_marked']/myobj['total_re'])*100 
            myobj['pending_dat_compliance'] = 100 - myobj['dat_compliance'] 
           } 
          } 
         } 
        } 
        returndata.push(myobj) 
       } 

以下 がクエリであります:

imports.db.mdb.collection('sales_details').find({'user.empcode':'481625'},function(err,sale_data){ 
myobj['test']=sale_data; 
}); 
returndata.push(myobj); 

//しかし、私はそれぞれ、すべてを試してみましたし、私はthis.Nodeは(見つける)最初にしてクエリが実行さを押す操作を実行している実行することができません。 私はdistinct_branch.lengthと等しいかどうかを比較することによってfindのコールバックでmyobjをプッシュしましたが、それも機能していません。 ありがとうございます。

+0

これを簡略化できますか? –

+0

こんにちはAkshay! mongodb .findは非同期に動作します。つまり、db-search操作をトリガーし、dbが検索する以外に、コードの残りの部分を並列実行します。 findメソッドが準備完了すると、コールバック(find関数で最後に指定した関数)が呼び出されます。あなたは 'returndata.push(myobj)'をコールバックの中に追加する必要があります。また、returndata配列を使用するコードを同期させなければならないので、istはプッシュ操作後にそれを消費します。私はあなたにヒントを与えることはできません、なぜならあなたはその使用法を示さなかったからです。 –

+0

私のreturndataは私のコントローラーで送ることができないように更新するだけです。 – Akshay

答えて

2

findメソッドは、期待どおりに動作します。 ;-)

nodej(googles V8 VM)は反応するように設計されていません。これは、nodejsプロセスでスレッドが1つしか実行されていないためです。結果として、長時間実行されるIO操作は、IOアクセスをトリガーするプログラムと並行して、それ自身のプロセスで実行されます。

つまり、db.collection.find({}, callback);を実行すると、vmはmongodbプロセスにデータの検索を要求し、次のステートメントを実行してから次のステートメントを実行する呼び出しprogramm /関数に制御を戻します。 DB検索は変数への値代入よりも長く続きますので、追加された値は未定義です。

DBが検索結果を返すとすぐに、callbackが実行され、エラー変数と結果変数が渡されます。コールバックを使用して、findメソッドを呼び出し元と同期させることができます。データが利用可能であると確信されたときに、コールバックの内部でsendメソッドを実行する。

例: findメソッドを使用して、明示的なルート要求に答えようとします。

... 
router.get(url, function(req,res,next) 
{ 
    db.find({...}, function(err, sale_data) 
    { 
     if (err) 
     { 
      next(err); 
     } 
     myobj['test']=sale_data;  
     returndata.push(myobj); 
     resp.json(returndata); 
    }); 
}); 

データが利用可能になるとすぐに要求が送信されます。

同期化は簡単ですが、返されたデータを使用してDBへの新しい非同期要求を開始し、戻りデータを使用し始めるとすぐに...同期フレームワークのようにasyncまたはKris Kowalskis Qによって処理されるような約束。

関連する問題