2016-09-26 4 views
0

Mongoでドキュメントを更新するためのAPIには、次のコードがあります。 collection.updateを使用してセクションに値を挿入し、別のcollection.updateを使用してこれらの値をドキュメント内の配列にプッシュします。同じ照会で値が設定されたMongoの更新レコード

しかし、私はこのコードを実行すると、をevents.eventTimeevents.endDate = nullに入れ続けます。これを正しく変更するにはどうすればよいですか?つまり、私は最初にruntime.に値を挿入し、次にそれらを使用してevents配列にプッシュします。

router.get('/stop/:id', function(req,res){ 
    var collection = db.get('Activity'); 

    //Important to use findOne here to get an object back instead of an array 
    collection.findOne({_id : req.params.id }, function(err, activity){ 
     if (err) throw err; 
     res.json(activity); 
     //console.log(activity); 

     collection.update({ 
      _id: activity._id 
     }, 
     { 
      $set: { 
        "runtime.started": false, 
        "runtime.endDate": new Date() 
      } 
     }, 
     function(err, activity){ 
      if (err) throw err; 
      //res.json(activity); 
      console.log(activity); 
     } 
     ); 

     collection.update({ 
      _id: activity._id 
     }, 
     { 
      $push: {events: { 
         eventTime: ((activity.runtime.endDate - activity.runtime.startDate)/1000), 
         startDate: activity.runtime.startDate, 
         endDate: activity.runtime.endDate 
        } 
       }, 
     }, 
     function(err, activity){ 
      if (err) throw err; 
      //res.json(activity); 
      console.log(activity); 
     } 
     ); 

    }); 
}); 

enter image description here

enter image description here

+0

に更新コールの両方をマージしようとすることができますか? – abdulbarik

+0

添付の画像を参照してください。 – MadPhysicist

+0

あなたは減算が効果的でしょうか? – abdulbarik

答えて

1

私はあなたが約束またはネストされたコールバックを使用する必要がありますいずれかの推測は、Javascriptを第2の更新コールが最初の後に呼び出されますように、それは現実には、見えそうにもかかわらず、非同期であります彼らは同時に呼び出されているので、私は奇妙な行動を推測します。

DBコールを約束して連鎖を適用する方がよいでしょう。多分あなたは印象的な$ q約束を見たいかもしれません。あなたが約束を使用したくない場合は、最初の更新呼び出し

router.get('/stop/:id', function(req,res){ 
    var collection = db.get('Activity'); 

    //Important to use findOne here to get an object back instead of an array 
    collection.findOne({_id : req.params.id }, function(err, activity){ 
     if (err) throw err; 
     res.json(activity); 
     //console.log(activity); 

     collection.update({ 
      _id: activity._id 
     }, 
     { 
      $set: { 
        "runtime.started": false, 
        "runtime.endDate": new Date() 
      } 
     }, 
     function(err, activity){ 
      if (err) throw err; 
      //res.json(activity); 
      console.log(activity); 
      collection.update({ 
      _id: activity._id 
      }, 
      { 
      $push: {events: { 
         eventTime: ((activity.runtime.endDate - activity.runtime.startDate)/1000), 
         startDate: activity.runtime.startDate, 
         endDate: activity.runtime.endDate 
        } 
       }, 
     }, 
     function(err, activity){ 
      if (err) throw err; 
      //res.json(activity); 
      console.log(activity); 
     } 
     ); 
     } 
     ); 

    }); }); 

はいの関数内で第2の更新メソッドを呼び出すには、約束が優れている理由です、かなり厄介に見えます。

更新、多分あなたはあなたのruntime.endDateとruntime.startDate値は何1

collection.findOne({_id : req.params.id }, function(err, activity){ 
     if (err) throw err; 
     res.json(activity); 
     //console.log(activity); 
     var date = new Date(); 
     var duration = (date - activity.runtime.startDate)/1000; 
     collection.update({ 
      _id: activity._id 
     }, 
     { 
      $set: { 
        "runtime.started": false, 
        "runtime.endDate": date 
      }, 
      $push: {events: { 
         eventTime: duration, 
         startDate: activity.runtime.startDate, 
         endDate: date 
        } 
       } 
     }, 
     function(err, activity){ 
      if (err) throw err; 
      //res.json(activity); 
      console.log(activity); 
    }); 

}); 
+0

約束をどうやって使うのですか?それははるかに良い方法であるのか、それとも単に代わりの方法ですか? – MadPhysicist

+0

また、昨日は何も似ていないものを試しました。実際、あなたのコードをコピーしましたが、Mongoを見ると 'runtime.endDate = null'が生成されます。 – MadPhysicist

+0

これは、I/Oコール(DBや読み込みファイルなど)の方がはるかに優れているだけでなく、https://www.npmjs.com/package/qの簡単な例から始めることができます。私が好む方法は、DB内のすべての呼び出しをモジュール内でラップし、ラップされたメソッドを呼び出すことによって連鎖を適用することです。いったんあなたがそれらに慣れれば約束は素晴らしいと頭痛を保存します。 –

関連する問題