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

Mongoose访问discriminators返回undefined 如何获取鉴别器列表

问题结论

该现象完全符合Mongoose的设计预期,不属于框架异常。

原因说明
  • discriminators是Mongoose内置属性,仅挂载在生成鉴别器的根基础Model实例上,用来存储该基础模型下注册的所有子鉴别器的键值映射,不会出现在你自定义的导出对象上。
  • 控制器中引入的PropertyModel是你通过module.exports导出的普通JavaScript对象,不是Mongoose生成的Model构造函数本身,这个普通对象没有内置的discriminators属性,直接访问自然返回undefined。
  • 打印PropertyModel时能看到所有子鉴别器模型,是因为你在注册其他子鉴别器时,手动将生成的子模型挂载到了这个导出对象上,属于自定义逻辑,和Mongoose内置的鉴别器存储机制无关。
正确获取所有关联鉴别器的实现方式

访问导出对象中存储的根基础模型(即你定义的Property模型)上的discriminators属性即可,代码示例:

const PropertyModel = require('../models/property');
module.exports.index = async (req, res) => {
    // 访问根基础模型上的discriminators属性,不要直接访问自定义导出对象
    const allDiscriminators = PropertyModel.Property.discriminators;
    console.log(allDiscriminators);
    // 返回值为对象格式:{ 鉴别器名称: 对应子Model构造函数 },包含所有已注册的子鉴别器
    res.render('properties/index');
}
补充注意点
  • 只有根基础模型会维护discriminators映射表,子鉴别器模型本身(比如示例中的Integer模型)上不存在该属性,访问会返回undefined。
  • 如果在调用Model.discriminator()注册任何子鉴别器之前访问基础模型的discriminators,也会返回undefined,完成至少一个子鉴别器注册后,Mongoose会自动初始化该属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:39:16