Mongoose如何映射驼峰字段与MongoDB全小写数据库字段?
解决Mongoose中驼峰Schema与小写数据库字段的映射问题
完全可以实现类似Golang mongo-driver里的字段映射效果,这也是解决你当前查询失效问题的标准方案——MongoDB的字段名是区分大小写的,直接用驼峰字段去查询小写存储的字段肯定会失败,我们需要让Mongoose帮我们做字段名的自动转换,具体方案如下:
方法一:使用Schema字段的field选项指定数据库字段名
这和你Golang里的bson:"xxx"标签逻辑完全匹配,在定义Mongoose Schema时,给每个驼峰命名的字段指定field属性,对应数据库中的全小写字段名:
const mongoose = require('mongoose'); const { Schema } = mongoose; const CompanySchema = new Schema({ _id: { type: Schema.Types.ObjectId, field: '_id' }, // 可选,默认映射就是_id name: { type: String, field: 'name' }, // 驼峰与小写一致时可省略,但建议统一写法保持清晰 address: { type: String, field: 'address' }, taxNumber: { type: String, field: 'taxnumber' } // 驼峰taxNumber对应数据库的taxnumber字段 }); const Company = mongoose.model('Company', CompanySchema);
配置完成后,你在代码中操作模型时完全可以用驼峰命名(比如company.taxNumber),Mongoose会自动在读写数据库时转换成对应的小写字段名,查询、新增、更新操作都会正常生效。
为什么不能忽略字段大小写?
MongoDB的集合字段名是严格区分大小写的,比如TaxNumber和taxnumber会被视为两个完全不同的字段,所以“忽略大小写查询字段”这种操作是不现实的,通过字段映射让Mongoose帮你做转换,才是最规范的解决思路。
举个实际查询的例子,现在你可以直接用驼峰字段发起查询:
// 代码中用驼峰taxNumber,Mongoose会自动转换成数据库的taxnumber字段执行查询 const company = await Company.findOne({ taxNumber: '123456' }); console.log(company.taxNumber); // 输出数据库中taxnumber字段的对应值
内容的提问来源于stack exchange,提问作者Élodie Petit
相关产品推荐
相关产品推荐

