Meteormongo:跨集合同步字段

Meteor mongo: sync fields across collections

本文关键字:同步 字段 集合 Meteormongo      更新时间:2023-09-26

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

{
    "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集合中的名称同步。有没有一种自动的方法可以做到这一点,比如在数据库级别,或者我在每个更改名称的地方都要手动更新?

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

据我所知,在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 ...
    }
}});