在Meteor中,我如何只查询给定订阅的记录?

时间:2015-01-02 20:23:23

标签: meteor

我理解订阅是一种将记录传输到客户端集合的方法,来自this post和其他人......

但是,根据this post,您可以有多个订阅流入同一个集合。

// 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);

现在 - 我通过两个不同的订阅获取了我的记录,我可以使用订阅来获取它撤回的记录吗?或者我必须重新询问我的收藏品吗?在客户端和服务器之间共享该查询的最佳实践是什么?

我希望我不会错过这里显而易见的东西,但仅仅因为它的副作用而执行Meteor.subscribe功能似乎正在丢失一条非常有用的信息 - 即记录来自哪个订阅。据推测,选择出版物和订阅的名称是有意义的 - 如果我能够获得与该名称相关的记录,那将是很好的。

3 个答案:

答案 0 :(得分:9)

您似乎想要做的是维护两个单独的记录集合,其中每个集合由不同的出版物填充。如果您阅读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());
  });
}

答案 1 :(得分:2)

这就是发生的事情:

假设您的服务器端BlogPosts Mongo集合包含来自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');并继续将当前用户的帖子下载到客户端Mini-Mongo的BlogPosts集合中。

Meteor将会看到Meteor.subscribe('posts-by-user', someUser);并继续将someuser的帖子下载到客户端Mini-Mongo的BlogPosts集合中。

现在,客户端Mini-Mongo BlogPosts集合有150个文档,这是server-side BlogPosts集合中500个文档的子集。

因此,如果您在客户端(Chrome控制台)中BlogPosts.find().fetch().count,则结果为150

答案 2 :(得分:0)

当然!这取决于您编写订阅的位置。在很多情况下,您可能正在使用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();
  }
));