2016-02-27 110 views
0

我想不出一個簡單的用例findAndModify的.....MongoDB的findAndModify更新所需的錯誤

db.collection('products').findAndModify(
     { 
      query: { _id: new o_id(cart[i]._id) }, 
      update: { $inc: { sold: qty, onstock: (-1*qty) } }, 
      new: true 
    },function(e,d) { 
     if (e) return console.log('findAndModify error',e); 
}); 

但上面的一貫返回以下錯誤..

{ 
    [ MongoError: need remove or update ] 
    name: 'MongoError', 
    message: 'need remove or update', 
    ok: 0, 
    errmsg: 'need remove or update' 
} 

上午我錯過了什麼?

也試過在回答表明從zangw

db.collection('products').findAndModify(
     { _id: new o_id(cart[i]._id) }, 
     { $inc: { sold: qty, onstock: (-1*qty) } }, 
     { new: true },function(e,d) { 
      if (e) { return console.log('updateStock findAndModify error',e); } 
      console.log('updated',d); 
     }); 

現在得到另一個錯誤

findAndModify error 
{ [MongoError: exception: nextSafe(): 
     { $err: "Can't canonicalize query: BadValue bad sort specification", 
     code: 17287 }] 
    name: 'MongoError', message: 'exception: nextSafe(): 
    { $err: "Can\'t canonicalize query: BadValue bad sort specification", 
    code: 17287 
    }', 
    errmsg: 'exception: nextSafe(): 
    { $err: "Can\'t canonicalize query: BadValue bad sort specification", 
    code: 17287 }', 
    code: 13106, 
    ok: 0 } 

正在運行的MongoDB 2.6.11

解決方案,通過@Blakes七(的建議在findAndModify上棄用)

db.collection('products').findOneAndUpdate(
     { _id: new o_id(cart[i]._id) }, 
     { $inc: { sold: qty, onstock: (-1*qty) } }, 
function(e,d) { 
     if (e) { return console.log('updateStock findAndModify error',e); } 

findAndModify將更新的文檔作爲d.value返回。

回答

0

複製@Blacks意見,因爲它

上有功能的取消通知(一直是幾個版本的現在),你應該使用.findOneAndUpdate()代替。

注意到在{ "returnOriginal": true }選項的主要區別是現在默認


findAndModify doc,該findAndModify

findAndModify(query, sort, doc[, options], callback) 

所以,請儘量將

db.collection('products').findAndModify(
      { _id: new o_id(cart[i]._id) }, 
      { _id:'descending'}, 
      { $inc: { sold: qty, onstock: (-1*qty) } }, 
      { new: true, upsert: true}, 
    function(e,d) { 
     if (e) return console.log('findAndModify error',e); 
}); 
+0

謝謝回覆。 – user3094755

+0

您建議失敗的格式,將用新tx更新問題。 – user3094755

+0

@ user3094755,添加'{_id:'降序'},因爲我的回答表明 – zangw