2016-02-27 2 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' 
} 

Am Я чего-то не хватает?

попытался также, как предложено в ответ от 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

SOLUTION, как это было предложено @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

Copy @Blacks комментарии, как это

существует устаревания уведомление о функции (было пару релизов в настоящее время), и вы должны использовать .findOneAndUpdate() вместо.

отмечая главное различие в опции { "returnOriginal": true } теперь по умолчанию


Per 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

Смежные вопросы