2014-10-19 42 views
8

我有以下的貓鼬模型:貓鼬findByIdAndUpdate移除所有尚未更新的屬性

var mongoose = require('mongoose'); 

var userSchema = mongoose.Schema({ 
    facebook: { 
     name: String, 
     email: String, 
     customerId: String 
    } 
}); 

var User = mongoose.model('User', userSchema); 

當我使用findByIdAndUpdate

User.findByIdAndUpdate(id, { 
    $set: { 
     facebook: { 
      name: name 
     } 
    } 
}); 

name得到更新更新此文檔的一部分,而emailcustomerId遭到移除(未設置?)。

我沒有找到這個記錄。

有沒有辦法僅使用findByIdAndUpdate更新特定的文檔屬性?

回答

13

FindByIdAndUpdate實際上是通過文檔ID發出mongodb findAndModify更新命令。

重點是你要設置一個對象來覆蓋舊的對象。如果你想更新一個字段,你需要修改你的更新對象。

User.findByIdAndUpdate(id, { 
$set: { 
    'facebook.name':name  
} 
}); 

這隻會更新名稱字段,保持休息對象在前一個。

+0

是的,謝謝。我只是在mongodb文檔中發現它。我必須使用$ set嗎? – krl 2014-10-19 09:33:59

+0

當然是如果你不使用$ set,它會更新文檔,只更新刪除所有舊字段的對象。 – 2014-10-19 09:38:20

+1

好吧,它沒有。我只是測試它沒有像這樣設置:User.findByIdAndUpdate(id,{'facebook.name':name}),它保留所有舊字段。 – krl 2014-10-19 09:41:02