Meteor observeChanges vs手动更新

Meteor observeChanges vs手动更新,meteor,Meteor,我有一个简单的待办事项模式:(只是一个示例来引出我的问题) 作者条目来自meteor.user。如果meteor用户更改了名字或姓氏,我必须更新todo。我有两种可能: observerChanges(服务器端)向用户收集并使用新的名字/姓氏更新此用户的所有TODO 如果我调用user update方法,我可以调用一个方法来更新所有TODO 何时最好使用cursor.observeChanges,何时最好调用更新方法手册?为什么?正如评论所说,如果作者姓名/电子邮件是可变的,则不应将其存储在文档

我有一个简单的待办事项模式:(只是一个示例来引出我的问题)

作者条目来自meteor.user。如果meteor用户更改了名字或姓氏,我必须更新todo。我有两种可能:

  • observerChanges(服务器端)向用户收集并使用新的名字/姓氏更新此用户的所有TODO

  • 如果我调用user update方法,我可以调用一个方法来更新所有TODO


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

    正如评论所说,如果作者姓名/电子邮件是可变的,则不应将其存储在文档中:

    仅在文档中存储用户ID,用户ID是不可变的

    在构建ToDo模板时,请按ID查找用户信息:您需要按ID为用户发布发布,并在客户端上以userId作为参数订阅发布

    Meteor.publish('userById', function(userId) {
        return Meteor.users.find({_id: userId}, {limit:1});
    });
    
    在route/template.on中,根据路由器创建,假设文档名为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>
    
    
    名字:{{作者.名字}
    姓氏:{{作者.姓氏}
    
    我认为你不应该依赖第二种方法,因为有时你(或你的队友)可能会忘记更新它。此外,如果您正在对其他集合中的用户数据进行非规范化,了解Meteor的用户可能只需调用您的Meteor.method或从浏览器控制台操纵数据库

    您可以使用此软件包:
    meteor添加matb33:收集挂钩

    它为mongo插入/更新/删除调用添加了一些钩子

    例如:

    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})
    
    (要高效地更新Todos集合,请确保将索引添加到“作者”字段)

    这只是一种比编写自己的
    observeChanges
    更简便的方法,而且比每次更新用户集合时手动更新Todos集合要好,因为在某些情况下您可能忘记调用它,或者某些黑客用户只是调用
    Meteor.users.update(Meteor.userId(),{…})
    也许


    但是,我仍然认为您应该始终添加一些自动更正机制,以避免显示错误的数据,因为无论您选择哪种方法,都会发生一些错误(可能在用户更新之后,监视数据库的服务器就崩溃了)。如果author.firstName与Meteor.users.findOne(author.u id)不匹配,您可以在显示内容时在客户端进行检查(但您必须发布用户…),然后调用一个方法通知服务器进行更新。

    理想情况下,您不应该像这样对数据进行反规范化。在MongoDB中,您应该只存储用户ID,并在必要时查找它。对此有许多不同的观点:检查“2.非规范化”并不是说您错了,但该帖子已经有近2年的历史了,而且有更新的解决方案。查看此软件包:编辑:我使用它,并推荐itok,谢谢。我将签出此软件包。publish-composite很好,但它有局限性:我从它开始编写,最后编写了自己的反应式连接,因为其他软件包(如publish counts或search)根本不能很好地使用它。抱歉,这不是我问题的答案。问题是,何时最好使用observerChanges以及何时通过方法调用更新(例如)相关集合。如何在mongo中反规范化数据是另一个问题。那么,什么时候更好?当性能更好或复杂性更低时。有时最好是去规范化,在这种情况下不是。observeChange将在后台连续运行;当您进行更新时,更新将是一次性的。这一切都取决于你期望事情改变的频率,但我想这不会太多。。。因此,在这种情况下,如果这是我仅有的两个选择,我会使用update,但如果我有设计的自由,我不会在这里进行反规范化。另一个示例:
    code
    Passwords.find({}).observeChanges({removed:function(id){PasswordsVaults.remove({passwordId:id});PasswordRequests.remove({“password.\u id”):id});},
    code
    这不应该用observerChanges来完成?你的问题是频率问题:如果更改经常发生,观察更改是一种很好的方法,但总是以设置钩子为代价。方法调用可能会慢一些,因为它是对服务器的调用,但如果是偶发事件,它最终需要资源更少。
    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})