MongoDB中使用ObjectId查询用户会话数据的问题求助
解决MongoDB会话查询匹配问题及ObjectId弃用警告
问题分析
你的Session集合中user_id存储的是ObjectId类型,但直接用字符串格式的existingUser._id查询时,MongoDB会严格匹配类型,导致返回空结果;而手动转换ObjectId时,因为触发了被弃用的数字入参构造函数逻辑,收到了TypeScript警告。
解决方案
1. 正确转换ObjectId并消除警告
根据existingUser._id的实际格式选择对应方法:
如果
existingUser._id是24位十六进制字符串(标准ObjectId格式):
用明确的字符串转换方法替代构造函数,避免TypeScript类型推断误判:const userId = mongoose.Types.ObjectId.createFromHexString(existingUser._id); const findSessions = await Session.find({ user_id: userId });也可以通过类型断言消除构造函数的误报警告:
const userId = new mongoose.Types.ObjectId(existingUser._id as string);如果
existingUser._id是数字类型(不推荐,不符合ObjectId规范):
按照警告提示使用createFromTime方法(注意:此方法是用时间戳生成ObjectId,仅当你的user_id是基于时间戳的数字时才适用):const userId = mongoose.Types.ObjectId.createFromTime(existingUser._id);
2. 从根源避免类型转换问题
在Session的Mongoose Schema中,将user_id字段明确指定为ObjectId类型并关联User集合:
const sessionSchema = new mongoose.Schema({ user_id: { type: mongoose.Schema.Types.ObjectId, ref: 'User', // 关联你的User模型 required: true }, // 其他会话字段... }); const Session = mongoose.model('Session', sessionSchema);
配置后,Mongoose会自动处理类型转换,查询时直接传入字符串或ObjectId格式的用户ID都能正确匹配,无需手动转换:
const findSessions = await Session.find({ user_id: existingUser._id });
内容的提问来源于stack exchange,提问作者Fakhrul Islam Fuad
相关产品推荐
相关产品推荐

