MongoDB查询5年前创建文档返回全部数据,求等效SQL写法的解决方案
解决MongoDB查询5年前文档返回全部数据的问题
我来帮你排查并解决这个问题!你的查询返回全部数据的核心原因是误用了已经废弃的getYear()方法,它的行为和你预期的完全不符。
问题分析
getYear()是一个已被废弃的日期方法,它返回的是当前年份减去1900(比如2025年调用new Date().getYear()会返回125)。当你执行new Date().setYear(new Date().getYear()-5)时,实际计算出来的是1900 + (125-5) = 1920年——这个日期太早了,几乎所有文档的createdDate都会满足$gte(大于等于)的条件,所以自然返回了全部数据。
对应SQL的正确MongoDB写法
你给出的SQL语句是查询创建年份大于当前年份减5的文档(也就是近5年创建的内容),对应的MongoDB写法可以直接比较年份数值,用$expr配合日期聚合操作符实现:
db.col.find({ $expr: { $gt: [ { $year: "$createdDate" }, { $subtract: [ { $year: new Date() }, 5 ] } ] } });
如果你实际需要的是「创建于5年前及更早」的文档
如果你的真实需求是查询日期早于或等于5年前今天的文档(也就是真正的“5年前创建”),可以用$lte操作符,配合标准的getFullYear()方法计算正确的日期:
// 方式1:拆分变量,更易读 const fiveYearsAgo = new Date(); fiveYearsAgo.setFullYear(fiveYearsAgo.getFullYear() - 5); db.col.find({ "createdDate": { $lte: fiveYearsAgo } });
或者写成一行简洁版:
db.col.find({ "createdDate": { $lte: new Date(new Date().setFullYear(new Date().getFullYear() - 5)) } });
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

