更新与upsert:真正不更新快速,mongoose?

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); } 

如果你运行上面的代码,你会得到Summary对象

在下面的代码我试图插入/更新代码,但插入工作,但它不更新

 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); } }); }); } 

在这里我试图插入或更新摘要汇总摘要对象。

我正在searchmobilenumber在Summarycollection如果mobilenumber已经exsist我正在更新该文档,否则,我正在创build该移动号码的新文档

插入正在工作,但如果mobilenumber已在汇总收集其不更新

三天以后帮我试试

我正在使用mongoose和数据库mlab版本3.2.11

所以先来看看这个。 同步和asynchronous编程有什么区别(在node.js中) 。 如果没有完全理解正在发生的事情,千万不要在同一个地方使用同步和asynchronous操作。

让我们尝试使用asynchronous方法重写您的代码。 首先我们来创buildpromise方法

 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并捕获结果。

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

Mongo更新文档https://docs.mongodb.com/manual/reference/method/db.collection.update/ Mongo updateOne docs https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/

承诺https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

如果你使用mongoose作为驱动程序。 阅读文档,了解如何通过查询来更新文档。 http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html

Mongo DB本地驱动程序允许您使用所有新的mongofunction和方法。 http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html

希望这可以帮助。

  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); } }); }); }); }