MongoDB按ID查询返回null问题排查请求
以下是针对你遇到的“能获取所有记录但按ID查询返回null”问题的排查方向:
验证传入的
id参数有效性
ObjectId要求必须是24位十六进制字符串,若传入的id格式不符(比如长度不对、包含非十六进制字符、是数字类型),new ObjectId(id)会生成无效的ObjectId,导致匹配失败。可以在代码中先做校验:if (!ObjectId.isValid(id)) { console.error('Invalid ObjectId format'); return; }简化查询语法
你当前的查询{ _id: { $eq: new ObjectId(id) } }等价于更简洁的{ _id: new ObjectId(id) },虽然功能一致,但简化写法可以排除不必要的语法层级可能带来的潜在问题,建议修改后测试。确认集合与数据库匹配
检查代码中连接的db是否对应Compass中查询的数据库,同时注意MongoDB集合名区分大小写,比如Compass中是Requests而代码里写requests,会导致查询错误的集合。检查数据库中
_id的实际类型
打开Compass查看目标记录的_id类型:- 如果是字符串类型而非ObjectId,代码中用
new ObjectId(id)查询自然匹配不上,此时应直接用{ _id: id }查询; - 如果是ObjectId,复制该ID到代码中硬编码测试,看是否能查询到,以此排除参数传递过程中的ID篡改问题。
- 如果是字符串类型而非ObjectId,代码中用
排查接口定义的潜在冲突
你在RequestRecord中显式定义了_id: ObjectId,而WithId<RequestRecord>已经自动为接口添加了_id字段,这种重复定义可能导致类型推断异常(虽然一般不影响实际查询,但可能隐藏其他问题)。建议修改接口:export interface RequestRecord { lateEntry: boolean, firstName: string, lastName: string, purchases: Array<object>, additionalComments: string, employeeId: number, approvals: Array<object>, submit: boolean, submissionDate: string, state: RequestStates }后续用
WithId<RequestRecord>来包含ID字段即可。调试验证生成的ObjectId
在代码中打印new ObjectId(id)的结果,将其复制到Compass中执行查询{ _id: 打印的ObjectId值 },如果查不到,说明生成的ID与数据库中的ID不匹配,需检查参数传递过程中是否有ID被修改。
内容的提问来源于stack exchange,提问作者JarochoEngineer

