MongooseMongoDB和意外的 "文本 "索引约束的违规行为

问题描述 投票:0回答: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 版本 v4.2.6 git 版本: 20364840b8f1af16917e4c23c1b5f5efd8b352f8 allocator: system modules: none build environment: distarch: x86_64 target_arch: x86_64

"mongoose"。"5.9.13",

使用该约束条件,我输入了3个相同的值。fieldA 而第四个不合格的是 fieldB

  1. { fieldA: 'abc', fieldB: 'test'}。
  2. { fieldA: 'abc', fieldB: 'test a' }。
  3. { fieldA: 'abc', fieldB: 'test 1' }。

这个不符合约束条件。

  1. { fieldA: 'abc', fieldB: 'test b' }。

有人看过这个吗?谢谢

mongodb mongoose database-indexes
1个回答
1
投票

文本索引的唯一属性会有问题。 坦率地说,我很惊讶它被允许用这种约束来创建。

文本索引中的键并不将字段值作为一个整体使用。 它收集了索引中文本部分所包含的所有字段,按空格和标点分割它们,应用特定语言的词干和排序规则,每个术语在索引中作为一个单独的键使用。

虽然不清楚唯一约束在哪里被检查,但结果显然有些不一致。

底线是使用唯一约束与文本索引可能不是特别有意义,也不可能达到你想达到的效果。

如果你需要对该字段进行文本搜索,同时保证该字段对的唯一性,最好的选择是建立2个索引,一个在 {fieldA:1, fieldB:"text"} 没有唯一的约束,而一个关于 {fieldA:1, fieldB:1} 具有唯一的约束条件。

© www.soinside.com 2019 - 2024. All rights reserved.