node.js - 如何从 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 中进行这种查询?
解决方案
好吧,经过大量搜索,我找到了一些示例,解决方案可能是:
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"
}
}
}
]);
};
我仍然必须评估这是否是最有效的解决方案以及是否可以扩展。
推荐阅读
- ios - 如何更改 iOS 图表中饼图的两个切片之间分隔符的颜色?
- azure - ForEach 活动如何在数据工厂中宣布成功?
- reactjs - 如何使用点击事件修改 React - typescript - Styled-components 应用程序中的 DOM?
- c - 什么是“更好”: (x=x) 或 (void(x)) 对于未使用的参数?
- reactjs - 从 React 读取 Cookie(使用 FastAPI + fastapi-jwt-auth 的后端)
- java - 如何仅限制某些用户访问我的应用程序中的特定功能?
- python - PyQt 在主窗口中嵌入 QWebEngineView
- c# - 是否可以知道 PDF 图像占位符的大小
- ms-access - 条件从变量号 ms-access 开始的序列
- c++ - C ++如何使对象的副本不指向原始对象