var userSchema = new Schema({
name: { type: String, default: null },
contacts: {
mobileNumber: {
countryCode: { type: String, default: null },
digits: { type: String, default: null }
},
email: { type: String, default: null },
facebook: { type: String, default: null },
googlePlus: { type: String, default: null },
twitter: { type: String, default: null },
linkedin: { type: String, default: null }
}}, { timestamps: true });
我想只更新此架构的特定嵌套字段。为此,我所做的是,
updateUser: function (userId, patchObject) {
var conditions = { "_id": userId };
User.update(conditions,{$set:patchObject});
}
但问题是,如果patchObject是{contacts:{email:“[email protected]”}},它会正确更新电子邮件,但它会替换整个联系人对象,其中我放弃了其他字段的所有预定义值。 (例如:facebook)
Google建议的是这个,
User.update(conditions,{"contacts.email":"[email protected]"});
但问题是我需要一种动态的方法来为任何类型的对象做这件事。我不能硬编码所有可能的值。有没有办法动态更新嵌套字段而不替换其他东西?
恕我直言,在猫鼬中进行这些更新的最好和最简单的方法是使用save()
方法。它允许你将mongodb记录作为普通的javascript对象处理,所以在我的节点网站上我尝试:
User.findOne( { email: email },
(err, user) => {
// modify your "data", probably with a callback chain
在其他一些功能,你可以user.save()
。当然,有$set
解决方法,但如果你只是想为你的用户做一个简单的更新,它更像是一种矫枉过正。通过这种方法,我甚至可以使用async
库在操作期间无痛地链接用户记录上的一系列更新。