Meteor:集合,variables,出版物和订阅的名称之间的区别?
在发现meteor的例子中,“post”和“post”之间有什么不同? 为什么当我们从服务器插入时使用“post”,但是当从浏览器中查询时,我们使用“post”? 这个系统不会被这个案例的差异弄糊涂吗?
我在posts.js中看到客户端Posts的variables赋值给服务器的post。 大写客户端和使用小型服务器的帽子是一个传统的符号吗?
Posts = new Meteor.Collection('posts')
为什么server / fixtures.js使用“Posts”? 我假设我们在浏览器(客户端)中查询“post”,并使用服务器中的“post”,就像我们在meteor蒙戈中所做的一样。 那么为什么我们现在在服务器上使用邮件?
让我们区分编程Meteor时可能需要处理的不同名称:
- variables名称 ,例如
Posts = new Meteor.Collection(...)
。 这些只是用来让你的代码知道如何访问这个variables。 meteor不知道或不在乎它是什么,尽pipe这个惯例是为了资本化。 - 集合名称 ,例如
new Meteor.Collection("posts")
。 这映射到一个MongoDB集合(在服务器上)或一个minimongo集合(在客户端上)的名称。 - 发布和订阅名称 ,在
Meteor.publish("foo", ...)
或Meteor.subscribe("foo")
。 这些必须匹配客户端订阅服务器上的一些数据。
在Meteor数据模型中需要匹配两件事情:
- 出版物的名称及其相应的订阅
- (通常)如果使用默认集合模型,则客户端和服务器上的集合的名称
订阅名称需要始终与发布的名称匹配。 但是,为给定订阅发送的集合与订阅名称无关。 实际上,可以在一个发布中发送多个游标,或者在不同的发布中发送一个集合,或者在每个发布中发送多个订阅 ,这些订阅在客户端中合并为一个。 您也可以在服务器和客户端拥有不同的集合名称; 继续阅读…
我们来回顾一下不同的情况:
-
简单的订阅模式 。 这是您通常在简单的Meteor演示中看到的一个。
在客户端和服务器上,
Posts = new Meteor.Collection("posts");
仅在服务器上:
Meteor.publish("postsPub", function() { return Posts.find() });
仅在客户端上:
Meteor.subscribe("postsPub")
这使用名为
postsPub
的发布来同步Posts
集合(在数据库中命名为posts
)。 -
一个出版物中有多个集合 。 您可以使用一个数组发送多个游标来查找单个发布。
在客户端和服务器上:
Posts = new Meteor.Collection("posts"); Comments = new Meteor.Collection("comments");
仅在服务器上:
Meteor.publish("postsAndComments", function() { return [ Posts.find(), Comments.find() ]; });
仅在客户端上:
Meteor.subscribe("postsAndComments");
这使用名为
postsAndComments
的单个发布来同步Posts
集合以及Comments
集合。 这种types的出版物非常适合关系数据; 例如,您可能只需要发布特定的post以及只与这些post关联的评论。 查看可以自动构build这些游标的包 。 -
单个集合的多个出版物 。 您可以使用多个发布来为由Meteor自动合并的单个集合发送不同的数据片。
在服务器和客户端上:
Posts = new Meteor.Collection("posts");
仅在服务器上:
Meteor.publish("top10Posts", function() { return Posts.find({}, { sort: {comments: -1}, limit: 10 }); }); Meteor.publish("newest10Posts", function() { return Posts.find({}, { sort: {timestamp: -1}, limit: 10 }); });
仅在客户端上:
Meteor.subscribe("top10Posts"); Meteor.subscribe("newest10Posts");
这会将10个post中的最多评论以及10个最新的post推送给用户,这将两组数据合并成单个
Posts
集合。 如果其中一个最新的post也是评论最多的Posts
,反之亦然,则Posts
集合将包含less于20个项目。 这是Meteor中的数据模型如何让您无需自己实现细节即可执行强大的数据合并操作的一个例子。 -
多个订阅每个出版物。 您可以使用不同的参数从同一发布中获取多组数据。
在服务器和客户端上:
Posts = new Meteor.Collection("posts");
仅在服务器上:
Meteor.publish("postsByUser", function(user) { return Posts.find({ userId: user }); });
仅在客户端上:
Meteor.subscribe("postsByUser", "fooUser"); Meteor.subscribe("postsByUser", "barUser");
这导致由
fooUser
和barUser
发布的post都显示在posts
集合中。 当你有几个不同的计算,看着你的数据的不同切片,并可能dynamic更新时,这个模型是很方便的。 请注意, 当您在Deps.autorun(...)
订阅时 ,Meteor会自动调用以前的任何具有相同名称的订阅句柄的stop()
,但如果您在autorun
之外使用这些订阅,则需要autorun
阻止。 就目前而言,在autorun
计算中,你不能做两个同名的订阅,因为meteor不能区分它们。 -
在出版物上推送任意数据。 您可以完全自定义发布服务器和客户端不需要相同的集合名称。 实际上,服务器可以发布根本不支持集合的数据。 要做到这一点,您可以将API用于发布function 。
仅在服务器上:
Posts = new Meteor.Collection("posts"); Meteor.publish("newPostsPub", function() { var sub = this; var subHandle = null; subHandle = Posts.find({}, { sort: {timestamp: -1}, limit: 10 }) .observeChanges({ added: function(id, fields) { sub.added("newposts", id, fields); }, changed: function(id, fields) { sub.changed("newposts", id, fields); }, removed: function(id) { sub.removed("newposts", id); } }); sub.ready(); sub.onStop(function() { subHandle.stop(); }) });
仅在客户端上:
NewPosts = new Meteor.Collection("newposts"); Meteor.subscribe("newPostsPub");
这将使用名为
newPostsPub
的发布/订阅,将服务器上的Posts
集合(称为数据库中的Posts
的最新10个post同步到客户端上的NewPosts
集合(称为newposts
in minimongo)。 请注意,observeChanges
不同于observe
,可以做一堆其他的事情 。代码看起来很复杂,但是当你在发布函数中返回一个游标时,这基本上就是Meteor在后台生成的代码。 通过这种方式编写出版物,可以更好地控制什么和不发送给客户端。 但要小心,因为您必须手动closures
observe
手柄并标记订阅何时准备就绪。 有关更多信息,请参阅Matt Debergalis对此过程的描述 (但是,该post已过时)。 当然,你可以把这个与上面的其他部分结合起来,以潜在地得到非常微妙和复杂的出版物。
对不起,这篇文章:-)但是很多人对此感到困惑,尽pipe描述所有的情况都是有用的。
你决定命名约定,meteor不关心。
文章成为mongo服务器的文档集合。 您可以通过调用Posts.find({author:'jim})来查找post。 在你写的例子中,meteor被告知在内部调用这个集合的'post'。 希望这很容易记住,如果名称是相似的…
需要有一种方法来expression和跟踪客户可以获得哪些信息。 有时候可能会有多个不同细节的信息。 示例:标题列表的摘要,但特定文档的详细信息。 这些通常也被命名为“post”,所以最初可能会引起混淆:
Meteor.publish "posts", -> # on server Posts.find()
接着
dbs.subscriptions.posts = Meteor.subscribe 'posts' # on client
发布和订阅名称必须匹配,但可以全部命名为:
PostsDB = new Meteor.Collection('postdocumentsonserver')
所以在mongo中你需要input
db.postdocumentsonserver.find()
但除此之外,你永远不需要关心“postdocumentsonserver”。 然后
Meteor.publish "post_titles", -> PostsDB.find({},{fields:{name:1}})
匹配
dbs.subscriptions.post_titles = Meteor.subscribe 'post_titles'