MongoDB findAndModify更新所需的错误

时间:2016-02-27 11:51:57

标签: javascript 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 Seven所建议的(在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返回。

1 个答案:

答案 0 :(得分:0)

复制@Blacks评论

  

该函数有一个弃用通知(现已有几个版本),您应该使用.findOneAndUpdate()代替。

     

注意{ "returnOriginal": true }选项的主要区别现在是默认

根据findAndModify docfindAndModify

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