【问题标题】:Mongoose - sort Date by date part only, ignoring timeMongoose - 仅按日期部分排序日期,忽略时间
【发布时间】:2019-01-23 21:46:34
【问题描述】:

我有以下型号的收藏:

const VisitSchema = new mongoose.Schema({
    priority: { type: Number, min: 1, max: 3, required: true },
    datetime: { type: Date, required: true },
    // some other information
});

我正在尝试对所有文档进行排序,以使更接近当前日期的访问显示在后面的访问之前,但在一天之内,必须首先显示优先级较高的访问。

例如:考虑

A (17-08-2018 14:00:00, P3)

B (17-08-2018 15:00:00, P2)

C (18-08-2018 15:00:00, P1)

排序时,所需的响应应该是[B, A, C],因为在17-08-2018 日,B 的优先级高于A,即使A 更早,即使C 的优先级高于C AB 都在晚些时候。

我正在寻找一种首先按datetime 排序的方法,但只考虑日期部分并忽略时间,然后按priority。我目前的尝试完全考虑了datetime,给了我错误的排序:

Visit.find().sort('datetime priority')

编辑:我知道我可以使用Array.sort() 做到这一点。问题是直接从mongoose 执行此操作,而不是检索数据然后再进行排序。

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以在 3.6 中尝试以下聚合进行自定义排序。

    使用$dateFromParts 计算$addFields 中没有时间的日期,以将计算值保留为文档中的额外字段,然后$sort 对字段进行排序。

    $project 排除以删除排序字段以获得预期的输出。

    db.col.aggregate([
     {"$addFields":{
       "date":{
         "$dateFromParts":{
           "year":{"$year":"$datetime"},
           "month":{"$month":"$datetime"},
           "day":{"$dayOfMonth":"$datetime"}
          }
        }
     }}, 
     {"$sort":{"date":-1,"priority":1}},
     {"$project":{"date":0}}
    ])
    

    【讨论】:

    • 很棒的答案!非常感谢!
    【解决方案2】:

    您可以尝试在 mongodb 3.0 及更高版本中使用$dateToString 将您的datetime 转换为您想要的格式 并且可以轻松$sort 加上日期

    db.collection.aggregate([
      { "$addFields": {
        "date": {
          { "$dateToString": {
            "format": "%Y-%m-%d", "date": "$datetime"
          }}
        }
      }},
      { "$sort": { "date": -1, "priority": 1 }}
    ])
    

    【讨论】:

      猜你喜欢
      • 2019-07-15
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2011-02-19
      相关资源
      最近更新 更多