首页 > 解决方案 > 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

  1. {字段A:'abc',字段B:'测试'}
  2. {字段A:'abc',字段B:'测试a'}
  3. {字段A:'abc',字段B:'测试1'}

这个没有约束:

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

有人见过这个吗?泰!

标签: mongodbmongoosedatabase-indexes

解决方案


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

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

目前尚不清楚唯一约束在哪里检查,但结果显然存在一些不一致。

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

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


推荐阅读