Valerio Santinelli
Valerio Santinelli

Reputation: 1702

How to read a collection that depends on another one in Meteor

I'm trying to load the latest post from a collection and at the same time all of the comments of that same post. The collection have references instead of storing the whole documents inside each other:

Post { title, body, etc..}
Comment { postId, body, etc.. }

I'm using iron-router as the routing package and in the route of my page I'm subscribing with this way:

this.route('home', {
    path: '/',
    template: 'home',
    waitOn: function () {
        return [
            Meteor.subscribe('latestPost'),
            Meteor.subscribe('lastReadPost')
            ];
    }
});

The code that retrieves the post is simply:

Posts.findOne({}, {sort:{createdAt:-1, limit:1}});

Now the problem is that I don't know how to retrieve the comments without reading the whole collection. I can't subscribe in the router as I still do not have the post ID to query the Comments collection. I guessed I could do that from the Template, but of course if I query the Comments collection, it's still empty. But I do have the postId as it's inside the Posts collection at that time. But I would need to trigger a subscription from the Template and that doesn't sound like a clean solution.

What would the best practice be? Thanks!

Upvotes: 3

Views: 177

Answers (2)

johntday
johntday

Reputation: 130

I would also include a limit in the server side finder options

{sort : {created : -1}, limit : 1}

Upvotes: 0

Kuba Wyrobek
Kuba Wyrobek

Reputation: 5273

Server side code:

Meteor.publish("latestPost", function () {
  var post = Posts.find({}, {sort:{created:-1}}).fetch()[0];
  console.log("publish : " + post.title);
  return [
    Posts.find({_id: post._id}),
    Comments.find({postId: post._id})
  ];
});

Client side code:

 this.route('home', {
    path: '/',
    template: 'home',
    waitOn: function () {
      return [
        Meteor.subscribe('latestPost')
      ];
    },
    data:function(){
      return {
       post:Posts.findOne(),
       comments:Comments.find()
      };
    }
   });

Check this repository to see whole example.

After user changes to another route, then subcriptions are being automatically stopped.

Upvotes: 1

Related Questions