Javascript Meteor mongo:跨集合同步字段

Javascript Meteor mongo:跨集合同步字段,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我有这样一份会议文件: { "name":"Meeting Name", "uuid":"NYoc2aL6", "participants":[ { "id":"JLKGZnfFkGvX9DHgz", "status":"joined", "name":"Guest 03" }, { // newly invited user,

我有这样一份会议文件:

{
    "name":"Meeting Name",
    "uuid":"NYoc2aL6",
    "participants":[
        {
            "id":"JLKGZnfFkGvX9DHgz",
            "status":"joined",
            "name":"Guest 03"
        },
        {
            // newly invited user, user hasn't logged in with invite url yet
            "id":"",
            "status":"invited",
            "name":"email@email.com"
        }
    ]
}

我需要将“name”字段与Users集合中的名称同步。有没有一种自动的方法可以做到这一点,比如在数据库级别,或者我在每个更改名称的地方都必须手动更新?

在Mongo或Meteor中没有我知道的“自动”方法可以做到这一点。但是,为什么不从文档中删除公共字段并链接ID呢?这被称为“数据库规范化”,这是一个从表(Mongo中的集合)中删除冗余数据以防止此类问题的过程。

这可以通过观察用户数据库上的更改“自动”完成:

var usersCursor = Meteor.users.find();
usersCursor.observeChanges({"changed":function(id, fields){
    if(fields.profile.name){
        ... do whatever needs to be done ...
    }
}});

这是流星中很常见的图案。您可以使用包“钩住”集合更新以同步共享值。当然,这应该在服务器端完成,这样您就不必担心某些相关文档无法提供给您

例如:

Meteor.users.after.update((userId, doc, fieldNames, modifier, options)=>{
  if ( fieldNames.indexOf('profile.name') > -1 ){ // the name was changed
    Meetings.update({ 'participants.id': doc._id },
      { $set: { 'participants.name': doc.profile.name }},
      { multi: true });
  }
});

数据库规范化最终会增加获取时间。如果你真的需要一次又一次地查找所有用户名,那么最好是将用户名存储到文档中。这要看情况而定。他会在检索数据时节省空间或时间吗?这是你必须更深入了解应用程序工作原理的地方。添加到文档将减少加载时间,增加保存时间和空间(对于重复的字段),并增加代码复杂性和保持同步的潜在问题。通过共享ID链接将消除同步代码的复杂性并减少空间,但也会增加更多集合并降低读取速度。它还可能增加插入/更新,具体取决于这些插入/更新的流动方式。在这些情况下,了解什么对应用程序更重要是有帮助的。在我的情况下,这是因为与可选的用户体验序列有关的更具体的原因,即在某些情况下,用户将被添加到会议中,但还没有实际的用户帐户,因此没有
user.profile.name
字段。正常情况下,我当然会尝试对所有内容进行规范化。是的,但是如果您确实想“规范化”,您可以拥有一个Attendee集合,其中存储的文档要么是firstname/lastname/emailaddress,要么只是指向用户对象的链接,类似多态性。这样,如果与会者是注册用户,则会将会议链接到与会者,然后与会者会链接到他们的帐户,如果不是,则会将会议链接到与会者。如果用户稍后注册,这很可能包括提供电子邮件,那么您可以将他们的与会者链接到他们的用户名。再说一次,这完全取决于你对什么感到舒服。这都是真的。我继续用一种使用
观察变化
的方法“回答”我的问题,因为这是我最初寻找的精神。现在,如果这是个好主意……;)