我无法想到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返回。
答案 0 :(得分: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);
});