meteor如何与客户端集合进行订阅?

时间:2016-10-05 14:50:00

标签: mongodb meteor collections subscription

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

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');)。但是,如果我想在客户端使用不同的集合名称呢?或者,如果服务器发送的信息是来自多个集合的混合字段,客户如何知道哪些集合在从订阅中获取时会存储此信息呢?

2 个答案:

答案 0 :(得分:0)

让我们分解代码:

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

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

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

现在开始将它链接到集合。在Meteor中,当您定义集合时,应在客户端和服务器上定义它。因此,当您在服务器上定义类似Tasks = new Mongo.collection('tasklists');的集合时,Tasks对象引用服务器将用于与mongoDB服务器通信的集合tasklists。在客户端上,创建名为Tasks的对象,以与在minimongo的客户端中创建的数据库tasklists进行交互。 Minimongo是JS for MongoDB的客户端API。 (您可以将其视为mongoDB数据库的客户端副本)。

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

关于出版物和订阅将如何知道,我们正在讨论哪个集合:出版物发送的内容称为光标,它与“mongoDB”中的特定文档和集合相关。只要您获得集合名称(tasklists)正确,您就可以在客户端和服务器上拥有不同的对象名称(Tasks)。

答案 1 :(得分:0)

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

您的帮助方法可以从不同的服务器集合中提取数据,并将数据放入数组中 - 您可以从不同的集合中读取这些内容,并且可以反应性地执行此操作,因此当源集合更改时,它将再次运行您的帮助程序

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

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