2017-03-09 145 views
0

我試圖更新我的集合中的所有文檔與我聲明在我的模型中的新字段。該字段爲布爾值,默認值爲false。更新貓鼬模型與新字段

我知道這個問題已經問過,但仍然無法解決我的問題。

所有我嘗試不工作。

這裏爲我的嘗試的例子:-cause我想更新的所有文件, 和空$集,因爲我不想做任何改變,只是增加我添加的字段具有空查詢 更新方法在我的模型

User.update({},{},{multi: true},function(err,num) { 
    if (err){ 
    console.log(err); 
    } 
    console.log(num); 
    console.log("all documents were updated with new field) 
    }) 

闖闖:

User.find({},function (err,docs) { 
      async.each(docs,function (doc,cb) { 
       doc.save(function (err) { 
       console.log(err); 
       cb(); 
       }) 
      },function() { 
      console.log("all documents were saved with new field) 
      }) 
     }) 

有什麼建議?

+0

您應該明確地將該字段添加到更新$ set(使用其默認值),因爲Mongoose不知道數據庫中的哪些文檔可能已經或可能沒有該字段,因此它不知道哪些文檔它必須設置默認值(雖然從Mongo shell運行更新操作可能會更容易/更快) – robertklep

回答

1

Mongoose不允許將undefined值設置爲字段。文件中缺少這些字段。您需要將某些東西傳遞給Mongoose以將其設置爲新字段的值。

所以,你可以設置一個空字符串 -

User.update({},{$set: {newField: ''}}......) 

或空 -

User.update({},{$set: {newField: null}}.....) 

,但你需要爲了提供一些值,貓鼬將其設置爲文件。

編輯 -

從貓鼬文檔 -

默認情況下,貓鼬只適用於當您創建一個新文檔的默認值。如果使用update()和findOneAndUpdate(),它將不會設置默認值。但是,mongoose 4.x允許您使用setDefaultsOnInsert選項選擇此行爲。

您可以閱讀更多關於它here

+0

我知道我可以這樣做,但它對我沒用, 我需要編寫通用腳本,我每次我將新場添加到我的模型時都會運行。 – masterG

+0

以及爲什麼貓鼬會嘗試保存未定義的值,如果它在模型中具有默認值? – masterG

+0

@masterG對不起,我沒有注意到你已經給出了一個默認值。請檢查我編輯的答案。 –