私が行った解決策は、Posts.find()を使用してカーソルを返す代わりに、テンプレートハンドラーで、ハンドルバーテンプレート(カテゴリオブジェクトの配列、それぞれがカテゴリには投稿の配列があります):
Template.postLists.categorizedPosts = function() {
var allPosts = Posts.find({}, {sort:{category:1}}).fetch();
// Then I iterate over allPosts with a loop,
// creating a new array of this structure:
// for ...
var catPosts = [ { category:"cat1", posts: [ {post1}, {post2} ] },
{ category:"cat2", posts: [ {post3}, {post4}, {post5} ] },
// etc...
];
// end loop
return catPosts;
テンプレートは次のようなものです(ただし、ULの代わりにテーブルを使用します。ここではよりクリーンなデモのためにULを使用しています)。
{{#each categorizedPosts}}
{{category}}
<ul>
{{#each posts}}
<li>{{posts.title}}</li>
{{/each}}
</ul>
{{/each}}
(Posts.find()が返すカーソルオブジェクトの代わりに)このようなオブジェクトを返すと、Meteorのテンプレートエンジンは、コレクション内のオブジェクトの1つだけが変更されたことをインテリジェントに検出する機能を失い、代わりにDOMにパッチを適用することに注意してください。テンプレートを完全に再レンダリングします。したがって、この場合、DBで単一のPostsオブジェクトが更新されても、テンプレートは完全に再レンダリングされます。それが欠点です。しかし、利点はそれが機能することです;)