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

如何不修改原文件从已导出的Mongoose模型提取Schema键名

Mongoose 未导出Schema时获取模型字段列表的实现方式

你之前的写法存在错误:Mongoose模型挂载关联Schema的属性是首字母小写的静态属性schema,并非可调用的Schema()方法,不需要加括号执行函数。

正确实现代码

const Bus = require('../bus');
// 从已编译模型上获取关联Schema,提取字段后过滤Mongoose内置自动生成字段
const fieldList = Object.keys(Bus.schema.paths).filter(field => {
  // 内置字段_id(主键)、__v(版本键)默认排除,可按需调整过滤规则
  return !['_id', '__v'].includes(field);
});

console.log(fieldList);

实现原理

  • Mongoose执行mongoose.model()编译生成模型时,会将传入的Schema实例挂载到模型的静态属性schema上,哪怕原Schema定义文件没有单独导出Schema变量,也可以通过这个属性直接访问完整Schema对象,完全不需要修改原定义文件。
  • Schema实例的paths属性存储了所有字段的定义配置,它的顶层键就是模型的全部字段名,除了自定义的业务字段外,还包含Mongoose默认添加的_id、__v两个内置字段,通过简单过滤就能得到需要的业务字段列表。

运行上述代码的输出如下,和你Schema中定义的字段完全对应:

[
  'busNumber',
  'cityId',
  'agencyId',
  'afcsAccountId',
  'agencyName',
  'depotName',
  'afcsAccountName',
  'operatorEmailId',
  'operatorMobile'
]

注:你给出的期望输出列表遗漏了Schema中明确定义的agencyName字段,如果不需要该字段,直接在过滤规则的数组中追加'agencyName',即可得到完全匹配你预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:06:23