2017-05-12 10 views
7

upsertでアップデート:express、mongooseでtrueが更新されていませんか?

var logs = [{ 
 
    mobilenumber: '1', 
 
    ref: 3, 
 
    points: 1000, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}, { 
 
    mobilenumber: '1', 
 
    ref: 6, 
 
    points: 2000, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}, { 
 
    mobilenumber: '2', 
 
    ref: 7, 
 
    points: 2600, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}, { 
 
    mobilenumber: '2', 
 
    ref: 15, 
 
    points: -1500, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}, { 
 
    mobilenumber: '10', 
 
    ref: 15, 
 
    points: 800, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}, { 
 
    mobilenumber: '11', 
 
    ref: 15, 
 
    points: 110, 
 
    ctype: 'mycredit', 
 
    entry: 'sdfsdf', 
 
    entry: 0 
 
}]; 
 

 
var summary = []; 
 
var positive = 0, 
 
    negative = 0, 
 
    total = 0, 
 
    count = 0; 
 
for (var i = 0; i < logs.length; i++) { 
 
    count = 0; 
 
    positive = 0; 
 
    negative = 0; 
 
    total = 0; 
 

 
    for (var j = i; j < logs.length; j++) { 
 
     if (logs[i].mobilenumber === logs[j].mobilenumber) { 
 
      if (logs[j].points < 0) { 
 
       negative += logs[j].points; 
 
      } else if (logs[j].points >= 0) { 
 
       positive += logs[j].points; 
 
      } 
 

 
      total += logs[j].points; 
 
      count++; 
 
     } 
 
    } 
 
    i += count - 1; 
 
    var obj = { 
 
     mobilenumber: logs[i].mobilenumber, 
 
     positivepoint: positive, 
 
     negativepoint: negative, 
 
     balancepoints: total 
 
    } 
 
    summary.push(obj); 
 
    
 
}

あなたは概要のI /更新コードを挿入しようとしていますが、挿入が動作しているが、そのは

var promiseArr = []; 
for(var i = 0; i<summary.length;i++) { 
    promiseArr.push(saveOrUpdate(summary[i].mobilenumber, summary[i])); 
} 


function saveOrUpdate (phone, dataToUpdate) { 
    return new Promise((resolve, reject) => { 
    //Update document if found or insert otherwise 
    // upsert:true -> If set to true, creates a new document when no document matches the query criteria 

     Summary.update({"mobilenumber": phone}, 
      dataToUpdate, 
      {upsert: true}, 
      function(err, raw){ 
       if (err) 
       { 
        console.log(err); 
       }else 
       { 
        console.log(raw); 
       } 

      }); 
    }); 
} 
を更新していない以下のコードで

オブジェクトを取得するコードの上に実行した場合

ここでは、サマリーコレクションにサマリーオブジェクトを挿入または更新しようとしています。

を更新していないその要約コレクションにMOBILENUMBERはすでに私がそうでなければ、その文書を更新していますexsist場合、私はSummarycollectionでMOBILENUMBERを探しています

、私は

そのMOBILENUMBERのための新しいドキュメントを作成しています挿入は機能していますが、もしMOBILENUMBERすでにTHER

私は最初にこのを見てみましょう

+1

可能重複http://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous -and-asynchronous-programming-in-node) –

+1

また、非同期モジュールを見てください。 https://github.com/caolan/async。それが役立ちます。 –

+1

'JSON.stringify(obj)'は正しくありません。 – robertklep

答えて

4
var promiseArr = []; 
    for (var i = 0; i < summary.length; i++) { 
     promiseArr.push(saveOrUpdate(summary[i].mobilenumber, summary[i])); 
    } 


    function saveOrUpdate(phone, dataToUpdate) { 
     return new Promise((resolve, reject) => { 

      //Update document if found or insert otherwise 
      // upsert:true -> If set to true, creates a new document when no document matches the query criteria 
      Summary.findOne({ 
       "mobilenumber": phone 
      }, function(err, data) { 
       var newSummary = dataToUpdate; 
       console.log(data); 
       console.log(newSummary); 
       if (data) { 
        newSummary.negativepoint += data.negativepoint; 
        newSummary.positivepoint += data.positivepoint; 
        newSummary.balancepoints += data.balancepoints; 
       } 
       Summary.update({ 
         "mobilenumber": phone 
        }, 
        dataToUpdate, { 
         upsert: true 
        }, 
        function(err, raw) { 
         if (err) { 
          console.log(err); 
         } else { 
          console.log(raw); 
         } 

        }); 

      }); 



     }); 
    } 
([(Node.jsの中の)同期および非同期プログラミングの違いは何である]の
4

マングースやデータベースMLABバージョン3.2.11を使用しています3日

以来しようとイムを私を助けて。 What is the difference between synchronous and asynchronous programming (in node.js)。何が起こっているのかを完全に理解することなく、同じ場所で同期操作と非同期操作を使用しないでください。

非同期アプローチを使用してコードを書き直そうとしましょう。 ファーストの約束方法

function saveOrUpdate (phone, dataToUpdate) { 
    return new Promise((resolve, reject) => { 
    //Update document if found or insert otherwise 
    // upsert:true -> If set to true, creates a new document when no document matches the query criteria 
     Summary.updateOne({"mobilenumber": phone}, 
      {$set : dataToUpdate}, 
      {upsert: true}, 
      function(err){ 
        err ? reject(err) : resolve(); 
      }); 
    }); 
} 

を作成してみましょう今だけの約束

var promiseArr = []; 
for(var i = 0; i<summary.length;i++) { 
    promiseArr.push(saveOrUpdate(summary[i].mobilenumber, summary[i])); 
} 

Promise.Allを使用してファイル名を指定して実行を約束してキャッチした結果の配列を作ります。

Promise.all(promiseArr) 
.then((res) => console.log("All done")) 
.catch(err => console.log(err)); 

モンゴ更新ドキュメント https://docs.mongodb.com/manual/reference/method/db.collection.update/ モンゴupdateOneドキュメントhttps://docs.mongodb.com/manual/reference/method/db.collection.updateOne/

約束https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

あなたはドライバーとしてマングースを使用している場合。ドキュメントを読み込んで、クエリごとにドキュメントを更新する方法を確認してください。 http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html

Mongo DBネイティブドライバでは、すべての新しいmongoの機能とメソッドを使用できます。 http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html

これが役に立ちます。

+0

エラーが発生しました... TypeError:Summary.updateOneは関数ではありません –

+0

。あなたはDBを照会するためにどのmongodbドライバを使用していますか?どのバージョンのmongo? –

+0

私はこれを使用して推薦するhttp://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#updateOne –

関連する問題