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

上失败
  1. { 字段 A: 'abc', 字段 B: 'test' }
  2. { 字段 A: 'abc', 字段 B: 'test a' }
  3. { 字段 A: 'abc', 字段 B: 'test 1' }

这个约束不合格:

  1. { 字段 A: 'abc', 字段 B: 'test b' }

有人看到了吗?泰!

唯一性 属性 的文本索引会出现问题。坦率地说,我很惊讶允许使用该约束创建它。

文本索引中的键没有使用整个字段值。它收集索引文本部分中包含的所有字段,按空格和标点符号拆分它们,应用特定于语言的词干提取和排序规则,并且每个术语在索引中用作单独的键。

不清楚检查唯一约束的位置,但结果显然存在一些不一致。

底线是将唯一约束与文本索引一起使用可能不是特别有意义,并且不太可能达到您想要达到的效果。

如果您需要对该字段进行文本搜索,同时确保该字段对的唯一性,最好的选择是创建 2 个索引,一个在没有唯一约束的 {fieldA:1, fieldB:"text"} 上,一个在 {fieldA:1, fieldB:1} 具有唯一约束。