mongodb - Mongoose/MongoDB 和意外的“文本”索引约束违规
问题描述
new mongoose.Schema({
fieldA: {
type: String,
required: true,
minlength: 3,
maxlength: 3,
},
fieldB: {
type: String,
maxlength: 20,
required: true,
trim: true,
}
}).index(
{
fieldA: 1,
fieldB: "text",
},
{unique: true}
)
mongod--版本
db 版本 v4.2.6 git 版本:20364840b8f1af16917e4c23c1b5f5efd8b352f8 分配器:系统模块:无构建环境:distarch:x86_64 target_arch:x86_64
“猫鼬”:“5.9.13”,
使用该约束,我输入了 3 个相同的值,fieldA
而第 4 个值失败fieldB
- {字段A:'abc',字段B:'测试'}
- {字段A:'abc',字段B:'测试a'}
- {字段A:'abc',字段B:'测试1'}
这个没有约束:
- {字段A:'abc',字段B:'测试b'}
有人见过这个吗?泰!
解决方案
文本索引将成为唯一属性的问题。坦率地说,我很惊讶允许使用该约束创建它。
文本索引中的键不使用整个字段值。它收集索引文本部分中包含的所有字段,按空格和标点符号将它们拆分,应用特定于语言的词干和排序规则,并且每个术语都用作索引中的单独键。
目前尚不清楚唯一约束在哪里检查,但结果显然存在一些不一致。
底线是使用带有文本索引的唯一约束可能不是特别有意义,并且不太可能达到您想要达到的效果。
如果您需要在确保该字段对的唯一性的同时对该字段进行文本搜索,最好的选择是创建 2 个索引,一个{fieldA:1, fieldB:"text"}
没有唯一约束,一个{fieldA:1, fieldB:1}
有唯一约束。
推荐阅读
- html - 添加一些 html 元素后,typeahead 不会从表中获取数据
- django - Django:“weblearn”不是注册的命名空间
- java - 如何创建具有单个边框的相邻材质按钮
- java - OpenAPI/Swagger-UI 注释和@BeanParam
- angular - 如何在 mat-stepper 中显示最后一个 mat-step 已完成?
- android - 通过搜索栏更改流音频的位置后,如何确定音频是否准备好播放?
- sql-server - 我在 Azure SQL Server 中收到此错误“操作系统错误代码 5(访问被拒绝。)”
- java - { "errorType": "java.lang.ExceptionInInitializerError" } 在 AWS Lambda 函数中
- oracle - 如何基于与上方/下方行相关的逻辑创建新列
- r - 如何将刺激随机分配到 4 个治疗组,并确保每个组包含偶数个真/假陈述?