我有一个简单的待办事项架构:(只是一个抽样我的问题的样本)
{
title: {
type: string
},
value: {
type: string
},
author: {
type: object
},
"author._id": {
type: string
},
"author.firstName": {
type: string
},
"author.lastName": {
type: string
},
}
作者条目来自meteor.user。如果meteor用户更改firstName或lastName,我必须更新todo。我有两种可能性:
observerChanges(服务器端)向用户收集并使用新名字/姓氏更新此用户的所有待办事项
如果我调用用户更新方法,我可以调用方法来更新所有待办事项
什么时候最好使用cursor.observeChanges,什么时候最好调用更新方法手册?为什么?
答案 0 :(得分:0)
正如评论所说,如果文档中的作者姓名/电子邮件是可变的,则不应将其存储在文档中:
仅将用户的ID存储在文档中,UserID是不可变的。
在构建ToDo模板时,按ID查找用户信息:您需要按ID发布用户的发布,并在userId作为参数的客户端上订阅它。
Meteor.publish('userById', function(userId) {
return Meteor.users.find({_id: userId}, {limit:1});
});
在您的路线/ template.onCreated中,具体取决于您的路由器,假设该文档名为doc
this.subscribe('userById', this.doc.author._id);
在模板助手
中Template.todoTemplate.helpers({
'Author': function() {
return Meteor.users.findOne({_id: this.doc.author._id});
}
});
并在模板中调用作者信息
<Template name="todoTemplate">
First Name: {{Author.first_name}}
Last Name: {{Author.last_name}}
</Template>
答案 1 :(得分:0)
我认为你不应该依赖第二种方法,因为有时你(或你的队友)可能会忘记更新它。此外,如果您正在对其他集合中的用户数据进行非规范化处理,知道Meteor的用户可能只是调用您的Meteor.method或从浏览器控制台操作数据库 ......
您可以使用此套餐:
vueify
它为你的mongo插入/更新/删除调用添加了一些钩子
例如:
vue.js
(要有效更新Todos集合,请确保将索引添加到作者字段)
这比编写自己的meteor add matb33:collection-hooks
更简单,并且比每次更新用户集合时手动更新Todos集合更好,因为在某些情况下您可能忘记调用它,或者某些黑客用户只是可能会调用Meteor.users.after.update(function (userId, doc, fieldNames, modifier, options) {
if (this.previous.firstName === doc.firstName && this.previous.lastName === doc.lastName) {
return;
}
Todos.update({'author._id': doc._id}, {
$set: {
'author.firstName': doc.firstName,
'author.lastName': doc.lastName,
}
})
}, {fetchPrevious: true})
......
但是,我认为你应该总是添加一些自动纠正机制以避免错误的数据被显示,因为无论你选择哪种方法,都会发生一些错误(也许服务器看到db只是在用户更新后崩溃) 。您可以在显示内容时检查客户端,如果author.firstName与observeChanges
不匹配(但您必须通过...发布用户),而不是调用方法告诉服务器更新它。