对连接的集合进行排序

时间:2016-05-11 15:46:28

标签: mongodb sorting meteor

我有两个系列,

  1. 产品
  2. 优惠
  3. 优惠是产品的子代,通过product密钥相关联。产品通过user密钥与用户相关:

    products : function(){
      return Products.find({'user': Meteor.userId()}).fetch();
    },
    offers: function(){
      return Offers.find({product: this._id}).fetch();
    }
    

    HTML:

    {{#each products}}
      {{#each offers}}
    
      {{/each}}
    {{/each}}
    

    我想在mongodb中应用offers.price 当我申请时,它只在每个产品内进行分类 如何在所有产品中按Offers.price排序?

2 个答案:

答案 0 :(得分:1)

您不能拥有两个集合的嵌套循环,并按内部排序:

{{#each products}}
  {{#each offers}}

  {{/each}}
{{/each}}

至少在一般情况下,这是不可能的,因为(通常)产品" A"可以提供最高价格,也可以是最低价格。

您可以做的是创建一个连接的产品和商品数组,然后按价格键对该数组进行排序。由于优惠是产品的子代,您可以这样做:

Template.myTemplate.helpers({
  joinedArray() {
    let array = [];
    Products.find({ 'user': Meteor.userId() }).forEach(p => {
      Offers.find({ product: p._id }).forEach(o => {
        array.push({ productName: p.name, offerName: o.name, offerPrice: o.price });
      });
    });
    return _.sortBy(array,'offerPrice');
  }
});

使用下划线sortBy功能完成排序。

array.push行中,我对您的馆藏中存在哪些键,您希望在助手中返回哪些键以及如何命名这些键进行了一些假设。在这种情况下,我假设你想按价格上涨的顺序排序。如果你想要相反的顺序,那么你可以.reverse()

如果您的Offers集合被非规范化并包含Products中的相关字段,那么您可以直接对该集合进行排序,并在一个循环中使用其中的密钥。

答案 1 :(得分:0)

用这样的东西排序:

return Offers.find({}, {sort: {price: 1}});

但我不知道你到底想要做什么。