首页 > 解决方案 > 如何从 MongoDB 的日期范围中展开日期?

问题描述

我在 mongoose 中为 nodejs 定义了一个 mongodb 模型,例如:

var schema = new mongoose.Schema({
  serial: {
    type: String,
    required: true,
    index: true
  },
  date_from: {
    type: Date,
    required: true
  },
  date_to: {
    type: Date,
    required: true
  }});

我有一个功能可以返回给定时期和序列的免费天数。因此,鉴于从 2020-01-01 到 2020-01-15 的日期范围,我将查询数据库并得到如下结果:

const busy_days = [
"2020-01-01 00:00:00", 
"2020-01-02 00:00:00", 
"2020-01-03 00:00:00", 
"2020-01-08 00:00:00"
"2020-01-09 00:00:00",
"2020-01-10 00:00:00",
"2020-01-14 00:00:00",
"2020-01-15 00:00:00"
]

之后,我的想法是使用 NodeJs 完成算法的其余部分,方法是检查 2020-01-01 和 2020-01-15 之间的哪些日期不在busy_days 列表中。

是否有可能在 mongoDb 中进行这种查询?

标签: node.jsmongodbmongoosemongodb-querymongoose-schema

解决方案


好吧,经过大量搜索,我找到了一些示例,解决方案可能是:

schema.statics.foo = function () {

  return this.aggregate([
    {
      $addFields: {
        days_diff: {
          $divide: [{
            $subtract: ["$date_to", "$date_from"]
          }, 86400000.0]
        }
      }
    }, {
      $project: {
        dates_in_between_inclusive: {
          $map: {
            input: { $range: [0, { $add: ["$days_diff", 1] }] }, // +1 for inclusive
            as: "dd",
            in: { $add: ["$date_from", { $multiply: ["$$dd", 86400000] }] }
          }
        }
      }
    }, {
      $unwind: "$dates_in_between_inclusive"
    }, {
      $group: {
        _id: null,
        dates: {
          $addToSet: "$dates_in_between_inclusive"
        }
      }
    }
  ]);
};

我仍然必须评估这是否是最有效的解决方案以及是否可以扩展。


推荐阅读