NodeJS新手求助:使用Mongoose查询MongoDB中自定义字符串格式日期的解决方案
Mongoose查询字符串格式日期范围的解决方案
嘿,我懂你碰到的麻烦了——用字符串存日期直接用$gte/$lt查范围肯定不对,因为MongoDB是按字符串的字典顺序比较,完全不是时间逻辑!这里给你两个实用的Mongoose解决方案,帮你搞定这个查询:
方法一:使用聚合管道转换日期(无需修改现有数据)
这个方案适合你不想改动现有数据结构的情况,通过聚合管道先把字符串格式的cusDate转换成MongoDB能识别的Date类型,再进行范围过滤:
// 先把查询的起止日期转换成标准Date对象 const fromDate = new Date("2020-06-01T00:00:00"); const toDate = new Date("2021-03-01T12:00:00"); const getOrdersData = await collection.aggregate([ // 第一步:添加一个临时字段,把字符串日期转成Date类型 { $addFields: { convertedCusDate: { $dateFromString: { dateString: "$cusDate", format: "%d/%m/%Y %I:%M %p" // 完全匹配你的DD/MM/YYYY hh:mm A格式 } } } }, // 第二步:根据转换后的日期过滤范围 { $match: { convertedCusDate: { $gte: fromDate, $lt: toDate } } }, // 第三步:移除临时字段,只返回原始数据结构 { $project: { convertedCusDate: 0 } } ]).exec();
解释一下$dateFromString的格式参数:
%d:两位数字的日期(比如12)%m:两位数字的月份(比如07)%Y:四位数字的年份(比如2020)%I:12小时制的两位数字小时(比如11)%M:两位数字的分钟(比如38)%p:AM/PM标识
方法二:将cusDate改为Date类型(长期最优方案)
如果可以修改数据模型,这是更推荐的做法——直接把cusDate定义为Date类型,不仅查询更简单,性能也更好:
1. 修改Mongoose Schema
const orderSchema = new mongoose.Schema({ cusDate: { type: Date, required: true }, cusName: String, cusEmail: String, __v: Number }); const Order = mongoose.model('Order', orderSchema); const collection = Order; // 替换成你的集合实例
2. 批量转换现有数据
把已经存在的字符串日期批量转换成Date类型:
await collection.updateMany( {}, // 匹配所有文档 [ { $set: { cusDate: { $dateFromString: { dateString: "$cusDate", format: "%d/%m/%Y %I:%M %p" } } } } ] );
3. 简单的范围查询
之后查询就和你最初想的一样简单了:
const fromDate = new Date("2020-06-01T00:00:00"); const toDate = new Date("2021-03-01T12:00:00"); const getOrdersData = await collection.find({ cusDate: { $gte: fromDate, $lt: toDate } }).exec();
这两种方法都能帮你得到期望的查询结果,如果你暂时不能改数据就用方法一,长期来看方法二更省心哦!
内容的提问来源于stack exchange,提问作者kicacob
相关产品推荐
相关产品推荐

