【问题标题】:Sorting across joined collections跨连接集合排序
【发布时间】:2016-09-07 03:25:39
【问题描述】:

我有两个收藏,

  1. 产品
  2. 优惠

优惠是产品的子级,通过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 中为 offer.price 应用排序 当我申请时,它只是在每个产品中排序 如何按Offers.price 对所有产品进行排序?

【问题讨论】:

  • 如果您展示一个示例或以其他方式非常明确地说明您要完成的工作,这将很有帮助。听起来您希望在外循环中对报价进行排序,但我不确定。
  • yup @DavidWeldon ,我希望对报价进行排序并在外循环(产品)

标签: mongodb sorting meteor


【解决方案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 的相关字段,那么您可以直接对该集合进行排序,并在一个循环中在您的帮助程序中使用其中的键。

【讨论】:

  • 谢谢,好主意...但是 forEach() 需要一个回调函数。 Products.find({'user': Meteor.userId()}).forEach(function(p){}
  • 引用荷马辛普森的话,“Doh!”
【解决方案2】:

用这样的东西排序:

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

但我不知道你想在这里做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多