2014-12-05 5 views
2

Я делаю Монго Schema.save(), который должен автоматически делать upsert, но она настаивает на том, чтобы сделать вставку, а затем ошибки сМонго DB Сохранить пытается вставить вместо обновления

E11000 duplicate key error index 

Это функция Node, что делает сохранить:

exports.ImpdateSave = function(req, res) { 
    var theImpdate = new Impdate(req.body) 
    if (theImpdate){ 
     var impdateId = req.params.id; 
     console.log("Node API Impdate: ", theImpdate); 
     console.log("Node API Impdate ID: ", impdateId); 
     theImpdate.save(function(err) { 
      if (err) { 
       console.log(err); 
       return res.send(400); 
      } 
      res.send(200); 
     }); 
    } else { 
     return res.status(400).send('There was no person data in the request to update. Please try again!');  
    } 
}; 

Почему не удалось найти документ, когда он делает первоначальный поиск до вставки/обновления, но затем находит его, когда это делает вставку?

Выход из консоли:

Node API Impdate: { _id: 5481c33cd8bf24f4235cff35, 
    _creator: 54679200502e901427fec6de, 
    name: 'XXXXX', 
    address: 'XXXXXXXXXXXXXXXX', 
    __v: 0} 

Node API Impdate ID: 5481c33cd8bf24f4235cff35 
{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: fullstack-dev.impdates.$_id_ dup key: { : ObjectId('5481c33cd8bf24f4235cff35') }] 
    name: 'MongoError', 
    code: 11000, 
    err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: fullstack-dev.impdates.$_id_ dup key: { : ObjectId(\'5481c33cd8bf24f4235cff35\') 
    }' } 
+0

Какова ценность дублирующего ключа? Я предполагаю, что это пустая строка или нуль, не так ли? В любом случае это опасный подход - вы должны * повторно извлечь объект перед вставкой; ваш объект 'theImpdate' поступает от клиента целиком и может иметь любой идентификатор, даже тот, который не принадлежит аутентифицированному пользователю, который позволит любому пользователю обновлять данные, которые им не принадлежат. – mnemosyn

+0

Нет. Добавили вывод console.log из функции выше ... –

+0

Хм, возможно, драйвер JS использует разные критерии для идентификации обновления. Повторное извлечение объекта сначала решает проблему? – mnemosyn

ответ

2

Мангуст-х save не делать upsert, как вы думаете. Когда вы создаете новый объект Impdate, как вы здесь, он всегда будет рассматривать его как новый документ, даже если содержащееся значение _id уже существует.

Вместо либо findOne док в соответствии с его _id, применить новые значения из тела и save или использовать findByIdAndUpdate.

+0

Все работает сладко сейчас! (После нескольких axtra хитростей для других ошибок!) Спасибо за помощь @JohnnyHK –

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