MongoDB中用双外键查询Inter_stu集合结果的正确Mongoose语句
解决Mongoose根据sid和iid查询面试结果的问题
你的查询返回空数组,大概率是因为没有将传入的sid/iid字符串转换为Mongoose的ObjectId类型——MongoDB Compass会自动识别字符串格式的ObjectId,但Mongoose需要显式转换才能匹配数据库中的ObjectId字段。
以下是几种正确的查询写法:
方法1:用findOne查询单条记录(推荐,sid+iid应为唯一组合)
const mongoose = require('mongoose'); // 确保模型名称与集合匹配,若集合名是inter_stus,需显式指定第三个参数 const InterStu = mongoose.model('Inter_stu', inter_stu_Schema); async function getInterviewResult(sid, iid) { try { // 先校验ObjectId合法性 if (!mongoose.Types.ObjectId.isValid(sid) || !mongoose.Types.ObjectId.isValid(iid)) { throw new Error('sid或iid格式无效'); } // 显式转换为ObjectId,只返回result字段 const record = await InterStu.findOne( { sid: new mongoose.Types.ObjectId(sid), iid: new mongoose.Types.ObjectId(iid) }, 'result' ); return record ? record.result : null; } catch (err) { console.error('查询失败:', err); throw err; } }
方法2:用find查询多条记录(适用于存在重复组合的场景)
async function getInterviewResults(sid, iid) { try { if (!mongoose.Types.ObjectId.isValid(sid) || !mongoose.Types.ObjectId.isValid(iid)) { throw new Error('sid或iid格式无效'); } const records = await InterStu.find( { sid: mongoose.Types.ObjectId(sid), iid: mongoose.Types.ObjectId(iid) }, 'result' ); return records.map(item => item.result); } catch (err) { console.error('查询失败:', err); throw err; } }
额外注意点
- 确认模型定义时的集合名是否正确:Mongoose默认会将模型名转为小写复数(比如
InterStu对应interstus),如果你的数据库集合是inter_stus,定义模型时要显式指定:mongoose.model('Inter_stu', inter_stu_Schema, 'inter_stus') - 传入的sid和iid必须是24位十六进制的合法ObjectId字符串,否则转换时会抛出异常
内容的提问来源于stack exchange,提问作者Aqib Ahmed
相关产品推荐
相关产品推荐

