0

I have removed autopublish from my Meteor app. Now I'm publishing my collections manually. I have some related collections. I want to increase performance as much as possible.

If I'm, for instance, looking at a post and want to see all the comments related to this post, I have to query the database with both post: Posts.findOne(postId) AND comments: Comments.find({postId: postId}). I am querying the two collections in the data field with iron-router so they are present in my template but I'm also subscribing the publications in waitOn. Now I have found https://github.com/englue/meteor-publish-composite which lets me publish multiple collections at the same time. But I don't quite understand it. If I'm using Meteor.publishComposite('postAndComments', ...) in server/publish.js, subscribing postAndComments in waitOn, and setting both post and comments in data as I normally do, will I then have saved a demand on the database? To me it looks like I still query the database the same number of times. But is the queries done when publishing the only queries made while the queries done i data is only a way to retrieve what has already been queried from the database?

Besides, in example 1, it is shown how to publish top posts with the belonging comments and post/comment authors, but in the template, only the posts are outputted. How can I also output the comments and authors? Have I misunderstood the potentials of publishComments? I understand it as a kind of a join.

Morten
  • 1

1 Answers1

0

I used publishComposite successfully. In my example below I'm subscribing to Units matching to filter as well as Properties those units belong to.

Meteor.publishComposite('unitsWithProperties', function (filter) {
    var filter = filter || {};
    console.log(filter);
    return {
        find: function () {
            var units;
            units = Units.find(filter);
            return units;
        },
        children: [
            {
                collectionName: 'properties',
                find: function (unit) {
                    return Properties.find({ _id: unit.propertyId });
                }
            }
        ]
    };
});

In your case I believe you can:

  • subscribe to Posts matching TopPosts criteria
  • subscribe to Comments and Authors of those posts in children: array of cursors

.

Hope this helps.

Alex

joystick
  • 150
  • 1
  • 9