如何更新嵌套的字段对象而不在Mongoose中动态更新整个对象?

时间:2017-12-23 12:30:59

标签: javascript node.js mongodb mongoose

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:“abc@aaa.com”}} ,它会正确更新电子邮件,但它会替换整个联系人对象其他字段的预定义值。 (例如:facebook)

谷歌建议的是这个,

User.update(conditions,{"contacts.email":"abc@aaa.com"});

但问题是我需要一种动态的方法来为任何类型的对象做这件事。我不能硬编码所有可能的值。 有没有办法动态更新嵌套字段而不替换其他内容?

1 个答案:

答案 0 :(得分:1)

恕我直言,在mongoose中进行这些更新的最好和最简单的方法是使用save()方法。它允许您将mongodb记录作为普通的javascript对象处理,因此在我的节点网站上我尝试:

    User.findOne( { email: email },
      (err, user) => {
      // modify your "data", probably with a callback chain

在某个其他功能中,您可以user.save()。当然,有$set解决方法,但如果您只想为用户完成一个简单的更新,则更多的是过度杀伤。通过这种方法,我甚至可以使用async库在操作期间无痛地链接用户记录上的一系列更新。