Waterline + Sails.js:将没有排序字段的文档排序到结果结尾

Waterline + Sails.js: Sort documents without the sort field to end of results

我有一个模型Event.js:

var Event = {
    schema: true,
    attributes: {
        time: {
            type: "datetime"
            // There can be events which don't have 'time' field
        }
        // Some more fields, some of which connect to other models
    }
}
module.exports = Event;

我想获取所有基于时间的事件。它们应按 time 升序排序,但所有不带 time 的事件应推到最后。

如何在不使用 .native() 的情况下执行此操作?我不想使用 'native' 因为我还想填充 Event.

中的几个字段

编辑:

假设我在 collection 中有以下文件:

// For simplicity I am using human readable date format
{id: 1, time: "5th Jan 2017"}
{id: 2}
{id: 3, time: "14th Dec 2016"}
{id: 4, time: "3rd Mar 2017"}
{id: 5}

它们应该这样排序:

{id: 3, time: "14th Dec 2016"}
{id: 1, time: "5th Jan 2017"}
{id: 4, time: "3rd Mar 2017"}
{id: 2}
{id: 5}

Sails.js 将 null 字段转换为 "low value" 属性进行排序。有两种可能的解决方法。

第一个是使用 defaultsTo 属性将其设置为无效值,如 "ǸA"。但是您不能使用 datetime 进行验证,必须创建一个自定义验证,尝试创建一个日期,并检查它是否有效。

您的模型将是:

time: {
  type: "string",
  defaultsTo: "NA"
}

并使用自定义验证来保证您的字符串是使用 Moment 库的日期:

Moment(myDate).isValid()

取决于您的数据库。与验证为 IsoDate String 的字符串字段相比,使用日期字段没有真正的优势。我已经在 MongoDB.

上测试过了

您可以在 sails documentation 中找到大量自定义验证的示例。


另一种选择。更简单的是,只是过滤空字段,不显示它。 然后你需要对 API 进行两次调用,但你可以将它封装到一个控制器函数中。

过滤蓝图中的空字段API。将是:

http://localhost:1337/event/where={"time":{"!":null}}