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

时间:2016-09-29 11:33:39

标签: node.js mongodb sails.js waterline

我有一个模型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中的几个字段。

修改

假设我在集合中有以下文件:

// 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}

1 个答案:

答案 0 :(得分:2)

Sails.js将null字段转换为“低值”属性以进行排序。有两种可能的解决方法。

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

您的模型将是:

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

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

Moment(myDate).isValid()

取决于您的数据库。在验证为IsoDate String的字符串字段上使用Date字段没有任何优势。我在 MongoDB 上测试了它。

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

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

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

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