【问题标题】:Meteor mongo: sync fields across collectionsMeteor mongo:跨集合同步字段
【发布时间】:2016-07-27 08:06:19
【问题描述】:

我有一个这样的会议文件:

{
    "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"
        }
    ]
}

我需要将“名称”字段与用户集合中的名称同步。有没有一种自动的方法来做到这一点,比如在数据库级别,还是我坚持在每个更改名称的地方手动更新?

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    这是 Meteor 中很常见的模式。您可以使用matb33:collection-hooks 包来“挂钩”集合更新以同步共享值。这当然应该在服务器端完成,因此您不必担心某些相关文档对您不可用。

    例子:

    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 });
      }
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 数据库规范化最终会增加获取时间。如果您真的必须一次又一次地查找所有用户名,最好将名称存储到文档中。所以这取决于。他会在检索数据时节省空间或时间吗
      • 这是您必须更深入地了解应用程序如何工作的地方。添加到文档将减少加载时间并增加保存时间和空间(对于重复的字段),以及增加代码复杂性和保持事物同步的潜在问题。通过共享 ID 链接将消除同步代码的复杂性并减少空间,但也会增加更多的集合并降低读取速度。它还可以增加插入/更新,具体取决于它们的流动方式。在这些情况下,了解对应用更重要的是什么。
      • 就我而言,这是出于更具体的原因与可选的用户体验序列有关,即在某些情况下,用户将被添加到会议中但还没有实际的用户帐户,所以没有user.profile.name 字段。通常情况下,我当然会尝试使一切正常化。
      • 对,但是如果您确实想要“规范化”,您可以拥有一个参加者集合,其中存储的文档是名字/姓氏/电子邮件地址,或者只是指向用户对象的链接,有点像多态性。这样,如果与会者是注册用户,它将会议链接到与会者,然后与会者链接到他们的帐户,但如果不是,它将会议链接到与会者。如果稍后用户注册,这很可能包括提供电子邮件,然后您可以翻转他们的参加者以链接到他们的用户 ID。同样,这完全取决于您对什么感到满意。
      • 全部正确。我继续使用observeChanges 的方法“回答”了我的问题,因为那是我最初寻找的精神。现在至于这是否是个好主意... ;)
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-07-20
        • 1970-01-01
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        相关资源
        最近更新 更多