如何不修改原文件从已导出的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
相关产品推荐
相关产品推荐

