更新 Meteor 中现有的 Mongo 集合对象

updating existing Mongo collection object in Meteor

我看到了像 this 这样的其他答案,但我认为我的回答更具体一些。

我有 Meteor.user() 作为 Object {_id: "iymu2h9uysCiKFHvc", emails: Array[2], profile: Object, services: Object}

我是 运行 一个在此处设置个人资料名字和姓氏的函数:

thisId = Meteor.userId();

Meteor.users.update({ _id: thisId }, { $set: {
  profile: {
    first_name: $('#firstName').val(),
    last_name: $('#lastName').val()
  }
}
});

但是,我也想在不同的事件中向配置文件添加一个 notifications 对象。 我试过了:

 thisId = Meteor.userId();

  Meteor.users.update({ _id: thisId }, { $set: {
    profile: {
      notifications: {
        rcptDwnldFile: Session.get('recpt-dwnld-file'),
        rcptPaysInv: Session.get('recpt-pays-inv'),
        invSentDue: Session.get('inv-sent-due'),
        // the rest
      }
    }
  }
});

但这会覆盖我的 first_namelast_name 条目。我也尝试了 $setOnInstert 但我得到了 update failed: Access denied. Operator $setOnInsert not allowed in a restricted collection. 但我认为默认情况下 profile 是用户可写的。

改用它(更多信息 link - 请参阅 在嵌入式文档中设置字段 部分):

thisId = Meteor.userId();

Meteor.users.update({ _id: thisId }, { $set: {
    'profile.first_name': $('#firstName').val(),
    'profile.last_name': $('#lastName').val()  
}
});

thisId = Meteor.userId();

Meteor.users.update({ _id: thisId }, { $set: {
        'profile.notifications.rcptDwnldFile': Session.get('recpt-dwnld-file'),
        'profile.notifications.rcptPaysInv': Session.get('recpt-pays-inv'),
        'profile.notifications.invSentDue': Session.get('inv-sent-due'),
        // the rest          
  }
});