【问题标题】:How to custom a sort query in mongodb?如何在 mongodb 中自定义排序查询?
【发布时间】:2020-11-29 23:16:54
【问题描述】:

我有一个格式为:

{ _id: 1, expiredAt: ISODate("2020-01-01T00:00:00.000Z") }
{ _id: 2, expiredAt: ISODate("2020-02-01T00:00:00.000Z") }
{ _id: 3, expiredAt: ISODate("2020-03-01T00:00:00.000Z") }
{ _id: 4, expiredAt: null }
{ _id: 5, expiredAt: null }

当前,我用 { expiredAt: 1} 排序并得到结果:

{ _id: 4, expiredAt: null }
{ _id: 5, expiredAt: null }
{ _id: 1, expiredAt: ISODate("2020-01-01T00:00:00.000Z") }
{ _id: 2, expiredAt: ISODate("2020-02-01T00:00:00.000Z") }
{ _id: 3, expiredAt: ISODate("2020-03-01T00:00:00.000Z") }

但我希望 expiredAt 值最大时 expiredAt 值 == null 或未定义。 预期结果:

{ _id: 1, expiredAt: ISODate("2020-01-01T00:00:00.000Z") }
{ _id: 2, expiredAt: ISODate("2020-02-01T00:00:00.000Z") }
{ _id: 3, expiredAt: ISODate("2020-03-01T00:00:00.000Z") }
{ _id: 4, expiredAt: null }
{ _id: 5, expiredAt: null }

如何自定义排序或任何方式来获得上述结果?

【问题讨论】:

标签: mongodb mongoose mongodb-query


【解决方案1】:

您可以使用Aggregation Pipeline

[
    {$addFields: {
       hasExpirationDate:  {$ne: ["$expiredAt", null]}
    }}, 
    {$sort: {
       hasExpirationDate: -1,
       expiredAt: 1
    }}
]

管道的第一阶段为每个文档添加一个名为 hasExpirationDate 的字段。该字段是通过检查 expiredAt 是否不等于 null 来计算的。

第二阶段进行排序。首先,它按 hasExpirationDate 字段的降序排序。然后按 expiredAt 字段升序排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2021-09-19
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多