在具有相同优先级的多个字段上排序

时间:2016-02-19 01:21:22

标签: mongodb meteor

OneCollection.find({}, {sort: {time1: -1, time2: -1}});

这一个time1优先于time2

我想基于两个字段进行排序。

  • 如果time1不存在,请使用time2。
  • 或者只是使用同等优先权。

无论哪种方式都可以。感谢

3 个答案:

答案 0 :(得分:0)

在服务器端,您可以尝试meteorhacks aggregate package,并在发布方法中执行比较(您可能希望缓存结果)。请注意,这是未经测试的:

if (Meteor.server) {
  Meteor.publish("OneCollection", function () {
    if (!this.userId) { // kick them out if they're not logged in
      this.stop();
      return;
    }
    var pipeline = [
      $project: {
        time: { $max: [ "time1", "time2" ] }
      }
    ];
    return OneCollection.aggregate(pipeline);
  }
}

答案 1 :(得分:0)

3条建议:

  1. 对客户端进行排序 - 这样您只需使用arr.sort([compareFunction])

  2. 转换出版物并添加字段https://www.eventedmind.com/items/meteor-transforming-collection-documents

  3. 将sortfield添加到数据模型(更新现有数据),以及将来保存/编辑对象时还添加/编辑sortfield。不要在出版物中包含该字段,但必要时使用它进行排序。

  4. 编辑:我会选择3 - 这样出版物会更有效率

答案 2 :(得分:0)

我设法使用aggregation处理类似情况。你可以尝试这样的事情:

OneCollection.aggregate([
  {
    $addFields: {
      time: {
        $cond: {
          if: {
            $and: [
              { $ifNull: ['$time1', false] },
              { $gt: ['$time2', '$time1'] }
            ]
          },
          then: '$time1',
          else: '$time2' } }
    }
  },
  { $sort: { time: -1 } },
  { $project: { time: false } }
]);

它会暂时添加 time 字段 time1 值,如果它存在并且大于 time2 值或 time2 值,否则使用它进行排序。然后,在排序操作完成后,它会从结果文档中删除时间字段。