// Snippet from Template
<div class="post-container">
  {{#each elements}}
    {{> post-element this}}
  {{/each}}
</div>

// Snippet from Client 
Meteor.subscribe('thePosts');

// Snippet from Server
Meteor.publish('thePosts', function(){
  return Posts.find({},  {sort:{createdAt:-1}, reactive:true});
});

When I do...

Posts.insert({body:postBody, createdAt: new Date()});

The post document gets added and appears at the end of my list, as opposed to descending order as specified in my publish function. Any idea about what I am doing wrong?

Thanks!

Solution 1

The publish function determines which records should be synced to the mini-mongo database of any subscribing clients. So sorting the data in the publish function actually has no effect on the client, as the client-side database will likely store them in some other way.

Of course you may want to use sort in a publisher's find in order to limit the number of records to the N most recent - but again this is just a way of deciding which records get synced and not how they are to be stored/used by the client.

Once the records have been synced to the client, it is up to the template code to determine how the results should be displayed. For example:

Template.myTemplate.elements = function() {
  return Posts.find({}, {sort: {createdAt:-1}});
}

Also see the "sorted publish" section of my post on common mistakes.

Solution 2

You didn't posted your template helper code.

When you do return Posts.find() from the helper function, the query should also contain the sort arguments, like as below:

Template.myTemplate.elements = function(){
   Meteor.subscribe('thePosts');
   return Posts.find({},  {sort:{createdAt:-1}, reactive:true});
}