Mongoose 5.6.11查询时自动修改字符串大小写?如何保留原大小写?
Mongoose查询时字符串自动转小写的问题解答
原因说明
查询时邮箱自动转小写是Mongoose的正常特性,触发原因是你定义Visitor模型的Schema时,给email字段配置了lowercase: true属性。
该配置的默认作用覆盖两个场景:
- 写入数据时,自动将该字段的传入值转为小写后存入数据库,避免因大小写差异产生重复数据
- 查询数据时,自动将查询条件中该字段的匹配值转为小写,保证和库中存储的小写数据匹配
保留原始大小写查询的方案
你不需要必须使用正则实现大小写相关的查询,可根据业务需求选择以下方案:
方案1:关闭全局自动小写转换(适合需要精确匹配大小写的场景)
直接修改Schema中email字段的配置,删除lowercase: true配置项即可,后续写入和查询都不会自动转换大小写,完全保留原始字符串。
示例Schema修改:
const visitorSchema = new mongoose.Schema({ // 移除原有的lowercase: true配置即可 email: { type: String, required: true } })
方案2:保留自动小写转换,灵活控制查询大小写规则
如果你仍需要保留写入时自动转小写的逻辑(比如统一库内邮箱格式),可根据需求选择对应查询方式:
- 更推荐:使用collation实现大小写不敏感查询(性能优于正则)
MongoDB 3.2及以上版本支持collation配置,设置strength为2即可实现忽略大小写的匹配,且可以正常命中字段索引,性能远高于正则查询:Visitor.findOne({ email: req.body.visitor.email }) .collation({ locale: 'en', strength: 2 }) .then(visitor => { /* 业务逻辑 */ }) - 如果必须使用正则:注意转义特殊字符
你当前的正则写法存在漏洞,邮箱中的.、+等属于正则特殊字符,会导致匹配逻辑不符合预期,需要先对匹配值做转义处理:// 先转义正则特殊字符 const escapedEmail = req.body.visitor.email.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') Visitor.findOne({email: {$regex: new RegExp(`^${escapedEmail}$`, 'i')}})
内容的提问来源于stack exchange,提问作者depperm
相关产品推荐
相关产品推荐

