2016-07-26 92 views
1

我有一个会议的文件是这样的:流星蒙戈:横跨收藏同步领域

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

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

回答

1

这是流星一个很常见的模式。您可以使用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 }); 
    } 
}); 
1

没有“自动”的方式来做到这一点,我知道在Mongo或流星。但是,为什么不把公共领域从你的文档中拿出来并且链接到ID?这就是所谓的“数据库标准化”,这是一个从表中删除多余数据(Mongo中的集合)以防止这些问题的过程。

+0

数据库标准化增加获取时间结束。如果你真的必须一次又一次查找所有的用户名,那么把名字存入文档会更好。所以这取决于。他将节省检索数据的空间或时间: – Dude

+0

这是您必须深入了解应用程序的工作方式的地方。添加到文档将减少加载时间并增加节省时间和空间(对于重复的字段),以及增加代码复杂性和保持事物同步的潜在问题。通过共享ID进行链接将消除同步代码的复杂性并减少空间,同时它还增加了更多收藏并降低了阅读速度。它也可以增加插入/更新,取决于这些流量的方式。知道什么是更重要的应用程序在这些情况下有帮助。 – CodeChimp

+0

在我的情况下,更具体的原因是与可选的用户体验序列有关,即在某些情况下,用户将被添加到会议中,但尚未拥有实际的用户帐户,因此没有'user.profile.name'领域。通常情况下,我会尽量规范一切。 – T3db0t

1

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

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