【问题标题】:Unsorted result set in sails.jsSails.js 中未排序的结果集
【发布时间】:2015-09-01 09:32:47
【问题描述】:

是否可以让查找查询以无序的方式返回结果集。我有一个包含以下数据集的表

Id  Country
1   Germany
2   Japan
3   China
4   England
5   USA

在触发以下查询时

Country.find({id:[1,5,3]}, function (err, result) { 
  res.json(result);
});

我明白了

1  Germany
3  China
5  USA

有没有办法关闭基于 id 的默认排序并按照预期顺序设置查询结果?

1  Germany
5  USA
3  China

【问题讨论】:

    标签: sails.js waterline


    【解决方案1】:

    您不能在查找查询中进行这种排序。实际上,您不想对查询结果进行排序,但您想按照 id 数组的顺序检索它们。 您无法在此处定义order_by 规则。查询语言的sort() 方法允许您使用列中的值按升序或降序进行排序。看来这不是你想要做的。

    一种解决方案是执行 n 查询以独立检索每条记录并将结果放入数组中。它效率不高,并且需要您编写一些额外的代码来管理来自多个异步调用数据库的数据。


    更好的解决方案是使用lodash。 Lodash 带有许多强大的函数来操作集合。执行这种任务是完美的。查看_.sortBy

    var filter = [1,5,3];
    Country.find({id:filter}, function (err, result) {
      sortedResult = _.sortBy(result, function(country) {
        return _.indexOf(filter, country.id);
      });
      res.json(sortedResult);
    });
    

    默认为lodash is globally available in sails


    最后,您可以使用纯 JavaScript 实现对结果进行排序:

    var filter = [1,5,3];
    Country.find({id:filter}, function (err, result) {
      result.sort(function(country_a, country_b) {
        return filter.indexOf(country_a.id) - filter.indexOf(country_b.id);
      })
      res.json(result);
    });
    

    我通常首先考虑使用 lodash 来执行此类任务,但纯 JavaScript 实现在这里就可以了。无论如何,我认为 lodash 实现仍然更容易阅读,在许多其他情况下,lodash 会给你更多的权力。

    【讨论】:

    • 感谢您的回答。只是好奇,当我可以使用排序查询语言时,为什么我需要使用 lodash 进行排序。
    • 我更新了答案并添加了另一个命题。我希望它更清楚:)
    • 谢谢。感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多