You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose插入含关联字段的Admin文档时role字段丢失问题

解决方案

问题出在Role.findOne({_id: 3})这行代码:Mongoose的查询方法默认返回Promise,你没有用await等待它解析,所以role变量是一个未兑现的Promise对象,而非实际的Role文档。此时访问role._id会得到undefined,Mongoose在创建文档时会自动忽略值为undefined的字段,因此最终插入的Admin文档没有role字段。

修正方法是给Role.findOne加上await关键字:

mongoose.connect("mongodb://127.0.0.1:27017/Test")
 
insertAdmin()
async function insertAdmin() { 
    try {       
        // 新增await等待查询结果
        const role = await Role.findOne({_id: 3});
        console.log("Role: ", role)

        const admin = await Admin.create({
            firstName : "Kate",
            lastName : "Eagan",
            email : "vvv@dd.com",
            role : role._id            
        })

        console.log("Admin added");
    } catch (err) {
        console.log(err.message)
        console.log("Admin NOT added");
    }
}

额外补充两点优化建议:

  1. Mongoose默认会将模型名转为小写复数形式,因此Role模型对应的集合应为roles(全小写)。虽然MongoDB查询时大小写不敏感,但建议保持集合命名与Mongoose默认行为一致。
  2. 可在查询Role后增加空值判断,避免插入无合法role关联的Admin:
const role = await Role.findOne({_id: 3});
if (!role) {
    throw new Error("指定ID的角色不存在");
}

内容的提问来源于stack exchange,提问作者user1960836

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:51:29