【问题标题】:how meteor match subscription with client collection?流星如何将订阅与客户端集合匹配?
【发布时间】:2017-02-14 02:12:48
【问题描述】:

在流星服务器端,这看起来不错,它将服务器端集合映射到发布

if (Meteor.isServer) { // This code only runs on the server 
Meteor.publish('tasks', function tasksPublication() { return Tasks.find(); }); }

客户端的以下内容也是可以理解的,它按名称将订阅映射到发布。

Meteor.subscribe('tasks');

但我在任何教程或文档中都找不到解释订阅和客户端集合如何相互映射的内容。没有代码映射任务(订阅)到任务(客户端集合)。 Meteor 可能通过包含相同的集合声明(Tasks = new Mongo.collection('Tasks');)来假设客户端集合使用与服务器端相同的名称。但是如果我想在客户端使用不同的集合名称怎么办?或者如果服务器发送的信息是来自多个集合的字段的混合,客户端从订阅中获取信息时如何知道哪些集合存储该信息?

【问题讨论】:

标签: mongodb meteor collections subscription


【解决方案1】:

让我们分解代码:

Meteor.publish('tasks', function() { 
    return Tasks.find(); 
});

在这里,我们定义了一个发布名称“tasks”,它提供了从函数return Tasks.find() 接收到的数据。

同样,在订阅时,我们会参考该特定出版物 - 在这种情况下为 tasks 并获得这些数据。

现在进入将其链接到集合的部分。在 Meteor 中,当你定义一个集合时,它应该在客户端和服务器上都定义。所以当你定义一个像Tasks = new Mongo.collection('tasklists');这样的集合时,在服务器上,Tasks对象指的是服务器将用来与mongoDB服务器通信的集合tasklists。在客户端上,将创建一个名为 Tasks 的对象,以与在客户端为 tasklists 创建的数据库 minimongo 进行交互。 Minimongo 是用于 MongoDB 的 JS 中的客户端 API。 (您可以将其视为 mongoDB 数据库的客户端副本)。

因此,在客户端,您可以将 Tasks 定义为任何东西,只要它是 mongoDB 集合 tasklists 的对象 - 例如 AnyName=new Mongo.collection('tasklists');

关于发布和订阅如何知道,我们谈论的是哪个集合:发布通过称为 cursor 的东西发送,它与 'mongoDB' 中的特定文档和集合相关。只要您获得正确的集合名称(tasklists),您就可以在客户端和服务器上拥有不同的对象名称(Tasks)。

【讨论】:

    【解决方案2】:

    这是 Meteor 工作方式的一部分。它会自动同步客户端和服务器之间的集合中的数据。你不需要担心它,你也无法改变它。

    您的辅助方法可以从不同的服务器集合中提取数据,并将数据放入数组中 - 您可以从不同的集合中读取数据来执行此操作,并且您可以被动地执行此操作,因此当源集合发生更改时,它将再次运行您的辅助方法.

    您还可以定义仅客户端的集合,这些集合不会保存到服务器。

    所以你可以做你想做的事,如果你想从你的smooshed数据中保存一些东西,你可能会编写一段代码来提取要更新的数据到一个对象中,然后保存它。

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2015-10-03
      • 2015-12-10
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多