node.js - 如何使用 mongoose 从 mongodb 获取两个日期之间的数据
问题描述
我的问题很简单。试图在两个日期之间从 mongodb 获取记录,例如 [01-06-2020 到 07-06-2020]。但不工作。怎么做?
日期格式为 dd-mm-yyyy
mongodb记录:
[
{
_id:ObjectId("5edd1df67b272e2d4cf36f70"),
date:"01-06-2020",
pid:1,
pname:"Micheck"
},
{
_id:ObjectId("5edd1dk67b272e2d4cf31f72"),
date:"03-06-2020",
pid:2,
pname:"Zohn"
},
{
_id:ObjectId("5edd1rf67b272e2d4cf16f73"),
date:"07-06-2020",
pid:3,
pname:"Robert"
},
{
_id:ObjectId("5edd1dw67b272e2d4cf76f76"),
date:"01-05-2020",
pid:6,
pname:"Josebh"
}
]
data.controller.js:
module.exports.getReportTableData = (req, res, next) => {
let collectionname = req.query.collection;
let date1 = "01-06-2020"; //dd-mm-yyyy
let date2 = "07-06-2020"; //dd-mm-yyyy
let tableReportdata = dbc.model(collectionname);
tableReportdata.find({ date: date1,date2 }, function(err, docs) {
if (err) {
console.log(err);
return;
} else {
console.log("Successful loaded data");
res.json({ data: docs, success: true, msg: 'Data loaded.' });
}
});
};
解决方案
此解决方案需要 Mongo 服务器版本 > 4.0.0
根据 OP 的评论,他使用的是 4.2.7 版
Mongo 当前将您的字段视为字符串,而不是日期,因此首先您必须将它们转换为日期。
我建议在写入数据库时将字段类型更改为日期,或者添加具有日期类型的新字段以获得更好的性能和更少的开销
要在运行时进行此转换,您必须将聚合管道与addFields dateFromString 匹配 gte和lte运算符一起使用。
您的代码应如下所示:
let date1 = new Date("2020-06-01T00:00:00.000Z"); // date objects
let date2 = new Date("2020-06-07T00:00:00.000Z");
let tableReportdata = dbc.model(collectionname);
tableReportdata.aggregate([{
$addFields: {
convertedDate: {
$dateFromString: {
dateString: "$date",
format: "%d-%m-%Y",
timezone: "UTC"
}
}
}
},
{
$match: {
convertedDate: {
$gte: date1,
$lte: date2,
}
}
}
], function(err, docs) {
if (err) {
console.log(err);
return;
} else {
console.log("Successful loaded data");
res.json({
data: docs,
success: true,
msg: 'Data loaded.'
});
}
});
推荐阅读
- javascript - TypeError 不是 Schema 方法的函数
- celery - 基于密钥执行任务
- python - 在 TF2.0 的自定义训练循环中应用任何回调
- gitlab - 如何让 gitlab-runner 使用通配符分支名称
- mysql - MYSQL:将双列转换为整数
- typescript - 如何在 TypeScript 中创建具有任何字段和某些特定字段/方法的对象?
- react-native - React Native Paper 中的“JSON.stringify 无法序列化循环结构”问题
- c# - 主体上下文凭证验证超时
- javascript - 根据 cms 数据更新删除本地存储中的项目
- java - 如何更改 HikariCP 记录时间?