2013-06-22 95 views
2

我試圖用Mongoose更新現有的記錄。插入是可以的,但不是更新。更新_id =:id與Mongoose的記錄

這裏是我的代碼片段:

app.post('/submit', function(req, res) { 

    var my_visit = new models.visits({ 
     date: req.body.visit_date, 
     type: req.body.visit_type, 
     agency: req.body.visit_agency, 
     city: req.body.visit_city, 
     url: req.body.visit_url, 
     note: req.body.visit_note 
    }); 

    // INSERT 
    if(req.body.id == 0) { 
     my_visit.save(function(err) { 
      if(err) { throw err; } 

      console.log('added visit'); 

      res.redirect('/'); 
     }); 
    } else { // UPDATE 
     var upsertData = my_visit.toObject(); 

     console.log(req.body.id); // OK 

     models.visits.update({ _id: req.body.id }, upsertData, { multi: false }, function(err) { 
      if(err) { throw err; } 

      console.log('updated visit: '+ req.body.id); 

      res.redirect('/'); 
     }); 
    } 


}) 

的響應Mod on _id is not allowed

我只想在MySQL中更新如WHERE id = id這一行。我沒有找到正確的語法。

回答

10

根據this questionthis other one,當一個人試圖而不先刪除它來更新基於其ID的對象發生Mod on _id is not allowed

我也發現這個github issue,它試圖解釋一個解決方案。它明確規定:

要小心,不要使用現有的模型實例進行更新條款 (這是行不通的,並可能導致像無限循環怪異的行爲)。 此外,請確保update子句沒有_id屬性, 導致Mongo返回「Mod on _id not allowed」錯誤。

的解決方案,似乎是要做到以下幾點:

var upsertData = my_visit.toObject(); 

console.log(req.body.id); // OK 

delete upsertData._id; 

models.visits.update({ _id: req.body.id }, upsertData, { multi: false }, function(err) { 
    if(err) { throw err; } 
    //... 
} 

在一個側面說明,你也許可以改寫你的路線,兩者都做的創建和更新,而不如 - else子句。 update()需要一個額外的選項upsert,其中,根據文檔:

UPSERT(布爾)是否創建文檔,如果它不匹配(假)