如何对嵌入式文档进行排序?

时间:2014-08-23 02:22:55

标签: mongodb meteor

有没有办法根据contentItems对文档进行排序?

我正在渲染每个内容项,如:

      {{#each contentItems}}
        {{> someTemplate}}
      {{/each}}

我想渲染每个按负载位置排序的。有没有办法用嵌入式文档(contentItems)做到这一点?

{
    "_id" : "sYKXwp27o2MCBtPsN",
    "contentItems" : [
        {
            "_id" : "NwsWpu3dqj7jByLkq",
            "position" : 0.75,
            "title" : "Nested animations in AngularJS using ui-router"
        },
        {
            "_id" : "Rve9R5uJzvrbgfrrX",
            "title" : "AngularJS Data Models: $http VS $resource VS Restangular",
            "position" : 1
        },
        {
            "_id" : "BNq9Fe9gdYJ6Wgoym",
            "position" : 0.875,
            "title" : "Random title? Nope it's static."
        }
    ],
    "title" : "Some title"
}

澄清一下:我希望能够按位置值对contentItems进行排序,而不是按文档本身的顺序排序。这可能吗?

2 个答案:

答案 0 :(得分:2)

您可以迭代对其进行排序的帮助程序的结果。例如:

{{#each sortedContentItems}}
  {{> someTemplate}}
{{/each}}

sortedContentItems的样子:

Template.myTemplate.helpers({
  sortedContentItems: function() {
    return _.sortBy(this.contentItems, 'position');
  }
});

如果你想要颠倒排序,你可以这样做:

Template.myTemplate.helpers({
  sortedContentItems: function() {
    return _.sortBy(this.contentItems, function(ci) {
      return -ci.position;
    });
  }
});

答案 1 :(得分:1)

David Weldon's answer添加一点,这可能是使用集合转换函数的好例子。根据Meteor文档:

  

如果为Collection或其任何检索方法指定转换选项,则在返回或传递给回调之前,文档将通过transform函数传递。这允许您从其数据库表示中添加方法或以其他方式修改集合的内容。您还可以指定特定查找,findOne,允许或拒绝调用的转换。

因此,您可以通过在findfindOne方法中传递转换选项来在帮助程序中进行排序,以检索文档。像这样:

{{#each sortedContentItems}}
  {{> someTemplate}}
{{/each}}
Template.page.helpers({
  sortedContentItems: function () {
    var item = Items.findOne({}, {
      transform: function (doc) {
        doc.contentItems = _.sortBy(doc.contentItems, 'position');
        return doc;
      }
    });
    return item && item.contentItems;
  }
});

我写了一个test in meteorpad,你可以在其中看到它。