Meteor observeChanges vs手动更新

时间:2016-01-05 16:35:52

标签: meteor

我有一个简单的待办事项架构:(只是一个抽样我的问题的样本)

{
  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。我有两种可能性:

  1. observerChanges(服务器端)向用户收集并使用新名字/姓氏更新此用户的所有待办事项

  2. 如果我调用用户更新方法,我可以调用方法来更新所有待办事项

  3. 什么时候最好使用cursor.observeChanges,什么时候最好调用更新方法手册?为什么?

2 个答案:

答案 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不匹配(但您必须通过...发布用户),而不是调用方法告诉服务器更新它。