[英]Meteor mongo: sync fields across collections
我有一个像这样的会议文件:
{
"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中的集合)以防止出现这类问题的过程。
这可以通过观察用户db的变化“自动”完成:
var usersCursor = Meteor.users.find();
usersCursor.observeChanges({"changed":function(id, fields){
if(fields.profile.name){
... do whatever needs to be done ...
}
}});
这是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 });
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.