在 Meteor 中,如何只查询给定订阅的记录?
In Meteor, how can I query only the records of a given subscription?
我知道订阅是一种将记录从 this post 流入 client-side collection 和其他...
的方式
但是,根据 this post,您可以有多个订阅流入同一个 collection。
// server
Meteor.publish('posts-current-user', function publishFunction() {
return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
// this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
}
Meteor.publish('posts-by-user', function publishFunction(who) {
return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
}
// client
Meteor.subscribe('posts-current-user');
Meteor.subscribe('posts-by-user', someUser);
现在 - 我通过两个不同的订阅获得了我的记录,我可以使用订阅来获取它撤回的记录吗?或者我必须重新查询我的 collection?在客户端和服务器之间共享该查询的最佳做法是什么?
我希望我没有在这里遗漏一些明显的东西,但是仅针对其 side-effects 执行 Meteor.subscribe
函数似乎丢失了一条非常有用的信息 - 即一条记录来自哪个订阅从。大概选择的出版物和订阅的名称是有意义的 - 如果我能获得与该名称关联的记录,那就太好了。
当然可以!这仅取决于您在哪里编写订阅。在很多情况下,您可能正在使用 Iron Router,在这种情况下,您可以让给定的路由只订阅您需要的数据。然后从该路由模板的帮助程序中,您只能查询该订阅中的文档。
但一般的想法是将特定订阅挂接到特定模板。
Template.onePost.helpers({
post: function() {
Meteor.subscribe('just-one-post', <id of post>);
return Posts.findOne();
}
});
Template.allPosts.helpers({
posts: function() {
Meteor.subscribe('all-posts');
return Posts.find();
}
));
事情是这样的:
假设您的 server-side BlogPosts
Mongo collection 包含来自 10 个不同用户的 500 个帖子。然后您在客户端订阅了两个不同的订阅:
Meteor.subscribe('posts-current-user'); // say that this has 50 documents
Meteor.subscribe('posts-by-user', someUser); // say that this has 100 documents
Meteor 将看到 Meteor.subscribe('posts-current-user');
并继续将当前用户的帖子下载到 client-side Mini-Mongo 的 BlogPosts
collection。
Meteor 然后会看到 Meteor.subscribe('posts-by-user', someUser);
并继续将 someuser
的帖子下载到 client-side Mini-Mongo 的 BlogPosts
collection .
所以现在 client-side Mini-Mongo BlogPosts
collection 有 150 个文档,这是 server-side BlogPosts
collection 中 500 个文档的子集。
因此,如果您在客户端(Chrome 控制台)中执行 BlogPosts.find().fetch().count
,结果将是 150
。
您似乎想要做的是维护两个独立的记录集合,其中每个集合由不同的出版物填充。如果你阅读 DDP specification,你会看到服务器告诉客户端每条记录属于哪个集合(不是发布),多个发布实际上可以为同一条记录提供不同的字段.
但是,Meteor 实际上允许您将记录发送到任意集合名称,客户端将查看它是否有该集合。例如:
if (Meteor.isServer) {
Posts = new Mongo.Collection('posts');
}
if (Meteor.isClient) {
MyPosts = new MongoCollection('my-posts');
OtherPosts = new MongoCollection('other-posts');
}
if (Meteor.isServer) {
Meteor.publish('my-posts', function() {
if (!this.userId) throw new Meteor.Error();
Mongo.Collection._publishCursor(Posts.find({
userId: this.UserId
}), this, 'my-posts');
this.ready();
});
Meteor.publish('other-posts', function() {
Mongo.Collection._publishCursor(Posts.find({
userId: {
$ne: this.userId
}
}), this, 'other-posts');
this.ready();
});
}
if (Meteor.isClient) {
Meteor.subscribe('my-posts', function() {
console.log(MyPosts.find().count());
});
Meteor.subscribe('other-posts', function() {
console.log(OtherPosts.find().count());
});
}
我知道订阅是一种将记录从 this post 流入 client-side collection 和其他...
的方式但是,根据 this post,您可以有多个订阅流入同一个 collection。
// server
Meteor.publish('posts-current-user', function publishFunction() {
return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
// this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
}
Meteor.publish('posts-by-user', function publishFunction(who) {
return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
}
// client
Meteor.subscribe('posts-current-user');
Meteor.subscribe('posts-by-user', someUser);
现在 - 我通过两个不同的订阅获得了我的记录,我可以使用订阅来获取它撤回的记录吗?或者我必须重新查询我的 collection?在客户端和服务器之间共享该查询的最佳做法是什么?
我希望我没有在这里遗漏一些明显的东西,但是仅针对其 side-effects 执行 Meteor.subscribe
函数似乎丢失了一条非常有用的信息 - 即一条记录来自哪个订阅从。大概选择的出版物和订阅的名称是有意义的 - 如果我能获得与该名称关联的记录,那就太好了。
当然可以!这仅取决于您在哪里编写订阅。在很多情况下,您可能正在使用 Iron Router,在这种情况下,您可以让给定的路由只订阅您需要的数据。然后从该路由模板的帮助程序中,您只能查询该订阅中的文档。
但一般的想法是将特定订阅挂接到特定模板。
Template.onePost.helpers({
post: function() {
Meteor.subscribe('just-one-post', <id of post>);
return Posts.findOne();
}
});
Template.allPosts.helpers({
posts: function() {
Meteor.subscribe('all-posts');
return Posts.find();
}
));
事情是这样的:
假设您的 server-side BlogPosts
Mongo collection 包含来自 10 个不同用户的 500 个帖子。然后您在客户端订阅了两个不同的订阅:
Meteor.subscribe('posts-current-user'); // say that this has 50 documents
Meteor.subscribe('posts-by-user', someUser); // say that this has 100 documents
Meteor 将看到 Meteor.subscribe('posts-current-user');
并继续将当前用户的帖子下载到 client-side Mini-Mongo 的 BlogPosts
collection。
Meteor 然后会看到 Meteor.subscribe('posts-by-user', someUser);
并继续将 someuser
的帖子下载到 client-side Mini-Mongo 的 BlogPosts
collection .
所以现在 client-side Mini-Mongo BlogPosts
collection 有 150 个文档,这是 server-side BlogPosts
collection 中 500 个文档的子集。
因此,如果您在客户端(Chrome 控制台)中执行 BlogPosts.find().fetch().count
,结果将是 150
。
您似乎想要做的是维护两个独立的记录集合,其中每个集合由不同的出版物填充。如果你阅读 DDP specification,你会看到服务器告诉客户端每条记录属于哪个集合(不是发布),多个发布实际上可以为同一条记录提供不同的字段.
但是,Meteor 实际上允许您将记录发送到任意集合名称,客户端将查看它是否有该集合。例如:
if (Meteor.isServer) {
Posts = new Mongo.Collection('posts');
}
if (Meteor.isClient) {
MyPosts = new MongoCollection('my-posts');
OtherPosts = new MongoCollection('other-posts');
}
if (Meteor.isServer) {
Meteor.publish('my-posts', function() {
if (!this.userId) throw new Meteor.Error();
Mongo.Collection._publishCursor(Posts.find({
userId: this.UserId
}), this, 'my-posts');
this.ready();
});
Meteor.publish('other-posts', function() {
Mongo.Collection._publishCursor(Posts.find({
userId: {
$ne: this.userId
}
}), this, 'other-posts');
this.ready();
});
}
if (Meteor.isClient) {
Meteor.subscribe('my-posts', function() {
console.log(MyPosts.find().count());
});
Meteor.subscribe('other-posts', function() {
console.log(OtherPosts.find().count());
});
}