Mongoose/MongoDB 和意外的 "text" 索引约束违规
Mongoose/MongoDB and unexpected "text" index constraint violation
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 --version
db version v4.2.6 git version:
20364840b8f1af16917e4c23c1b5f5efd8b352f8 allocator: system modules:
none build environment:
distarch: x86_64
target_arch: x86_64
"mongoose": "5.9.13",
使用该约束,我输入了 3 个具有相同 fieldA
的值,而第 4 个在 fieldB
上失败
- { 字段 A: 'abc', 字段 B: 'test' }
- { 字段 A: 'abc', 字段 B: 'test a' }
- { 字段 A: 'abc', 字段 B: 'test 1' }
这个约束不合格:
- { 字段 A: 'abc', 字段 B: 'test b' }
有人看到了吗?泰!
唯一性 属性 的文本索引会出现问题。坦率地说,我很惊讶允许使用该约束创建它。
文本索引中的键没有使用整个字段值。它收集索引文本部分中包含的所有字段,按空格和标点符号拆分它们,应用特定于语言的词干提取和排序规则,并且每个术语在索引中用作单独的键。
不清楚检查唯一约束的位置,但结果显然存在一些不一致。
底线是将唯一约束与文本索引一起使用可能不是特别有意义,并且不太可能达到您想要达到的效果。
如果您需要对该字段进行文本搜索,同时确保该字段对的唯一性,最好的选择是创建 2 个索引,一个在没有唯一约束的 {fieldA:1, fieldB:"text"}
上,一个在 {fieldA:1, fieldB:1}
具有唯一约束。
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 --version
db version v4.2.6 git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8 allocator: system modules: none build environment: distarch: x86_64 target_arch: x86_64
"mongoose": "5.9.13",
使用该约束,我输入了 3 个具有相同 fieldA
的值,而第 4 个在 fieldB
- { 字段 A: 'abc', 字段 B: 'test' }
- { 字段 A: 'abc', 字段 B: 'test a' }
- { 字段 A: 'abc', 字段 B: 'test 1' }
这个约束不合格:
- { 字段 A: 'abc', 字段 B: 'test b' }
有人看到了吗?泰!
唯一性 属性 的文本索引会出现问题。坦率地说,我很惊讶允许使用该约束创建它。
文本索引中的键没有使用整个字段值。它收集索引文本部分中包含的所有字段,按空格和标点符号拆分它们,应用特定于语言的词干提取和排序规则,并且每个术语在索引中用作单独的键。
不清楚检查唯一约束的位置,但结果显然存在一些不一致。
底线是将唯一约束与文本索引一起使用可能不是特别有意义,并且不太可能达到您想要达到的效果。
如果您需要对该字段进行文本搜索,同时确保该字段对的唯一性,最好的选择是创建 2 个索引,一个在没有唯一约束的 {fieldA:1, fieldB:"text"}
上,一个在 {fieldA:1, fieldB:1}
具有唯一约束。