Mongoose中基于日期字段前缀匹配查询文档的问题求助
解决Mongoose中按日期分钟段查询文档的问题
嘿,我完全懂你的困扰——你想用正则匹配日期字段却没生效,核心原因其实是你的event_time_produce字段是Date类型,而不是字符串类型,直接用字符串正则去匹配肯定行不通!
为什么之前的正则写法无效?
当你在Mongoose里查询Date类型字段时,如果你传入正则表达式,Mongoose会尝试把正则转成Date对象,这显然不符合逻辑,自然匹配不到任何结果。而精确匹配时,你传入的字符串会被Mongoose自动转成对应的Date对象,所以能正常命中目标文档。
推荐解决方案:时间范围查询(性能最优)
这是MongoDB处理日期查询的标准方式,能利用字段索引,大数据量下性能远优于正则匹配。我们只需要算出目标分钟的起始和结束时间,查询这个时间范围内的所有文档即可:
// 定义11:00整分钟的起始和结束时间 const startTime = new Date('2018-01-03T11:00:00.000Z'); const endTime = new Date('2018-01-03T11:01:00.000Z'); MY_EVENT.find({ event_time_produce: { $gte: startTime, // 大于等于起始时间 $lt: endTime // 小于结束时间(不包含11:01及以后) } }).exec((err, results) => { if (err) { // 处理错误 console.error(err); return; } // 处理查询结果 console.log(results); });
备选方案:转字符串后正则匹配(不推荐,性能差)
如果你一定要用类似SQL LIKE的写法,需要先把Date字段转成字符串再匹配(要求MongoDB 4.0+),但这种方式无法利用索引,数据量大时会很慢:
MY_EVENT.find({ $expr: { $regexMatch: { input: { $toString: "$event_time_produce" }, regex: "^2018-01-03T11:00:" } } }).exec((err, results) => { // 处理结果或错误 });
总结
优先选择时间范围查询,这是最符合MongoDB设计思路、性能最优的方案。正则匹配只适合小数据量的场景,尽量避免在生产环境中使用。
内容的提问来源于stack exchange,提问作者Anis Mokeddes
相关产品推荐
相关产品推荐

