MongoDB查询AuditReport集合指定员工指定日期数据失败求助
问题解决方法
你的查询没返回结果,核心原因是Checked in字段存储的是带时间的完整字符串(比如06/20/2023 06:11 APM),而你用$eq直接匹配纯日期字符串06/20/2023,两者完全不相等,自然查不到数据。下面给你两种可行的解决方式:
方法一:用正则表达式匹配日期前缀
直接针对字符串格式做匹配,查询所有Checked in以06/20/2023开头的记录:
db.getCollection("AuditReport").find( { "Employee Name": "a1", "Checked in": { "$regex": "^06/20/2023" } } );
另外注意你的数据里有一条a1的记录,字段名是Employee Name(两个空格),如果要把这条也纳入查询,需要加上$or条件:
db.getCollection("AuditReport").find( { $or: [ { "Employee Name": "a1" }, { "Employee Name": "a1" } ], "Checked in": { "$regex": "^06/20/2023" } } );
方法二:将日期转为Date类型(推荐)
字符串存储日期不利于后续的范围查询(比如查某月的所有记录),更规范的做法是把Checked in字段转换为MongoDB的Date类型。
1. 先批量转换现有数据
运行以下脚本将字符串日期转为Date对象(注意处理格式里的APM笔误,应该是AM/PM):
db.getCollection("AuditReport").find().forEach(doc => { // 修正可能的笔误:把APM替换成AM let checkedInStr = doc["Checked in"].replace("APM", "AM"); // 解析字符串为Date对象(MM/DD/YYYY hh:mm AM/PM格式) let checkedInDate = new Date(checkedInStr); // 更新文档 db.getCollection("AuditReport").updateOne( { "_id": doc._id }, { "$set": { "Checked in": checkedInDate } } ); });
2. 用日期范围查询目标数据
转换完成后,就可以用更高效的日期范围查询来获取2023年6月20日的所有记录:
db.getCollection("AuditReport").find( { "Employee Name": "a1", "Checked in": { "$gte": new Date("2023-06-20"), "$lt": new Date("2023-06-21") } } );
同样,如果要包含字段名是Employee Name的记录,加上$or条件即可。
内容的提问来源于stack exchange,提问作者vicky
相关产品推荐
相关产品推荐

