MongoDB多个不区分大小写的字段的唯一索引,错误消息没有意义

时间:2018-09-27 11:24:15

标签: node.js mongodb

我使用以下索引创建了一个集合。只有名称是字符串类型,并且应该以不区分大小写的方式进行检查。只允许“ A”或“ a”

db.collection('myCollection').createIndex(
          { "name": 1, "type": 1, "ref": 1 }, { unique: true, collation: { locale: 'en', strength: 1 }});
      })
    }

我已经测试过并且可以正常工作,但我不理解错误消息:

{
    "errorMessage": "E11000 duplicate key error collection: my.myCollection index: name_1_type_1_ref_1 dup key: { : \"O1XO\u0006\u000c)MN11\", : \")MB1O1FG1\", : null }"
}

dup键部分是什么意思?这是正确的方法吗?

3 个答案:

答案 0 :(得分:0)

您的mongodb服务器版本是什么?我尝试mongodb 4.0的工作;

 //mongodb version 4.0

db.createCollection("TestIndex");

db.getCollection('TestIndex').createIndex(
{ "name": 1, "type": 1, "ref": 1 }, { unique: true, collation: { locale: 'en', strength: 2 }});

db.getCollection('TestIndex').insert({ "name" : "A",
    "type" : "B",
    "ref" : "C"});

db.getCollection('TestIndex').insert({ "name" : "A",
    "type" : "B",
    "ref" : "c"});
//E11000 duplicate key error collection: test_db.TestIndex index: name_1_type_1_ref_1 dup key: { : ")", : "+", : "-" }

db.getCollection('TestIndex').drop();

db.createCollection("TestIndex");
db.getCollection('TestIndex').createIndex(
{ "name": 1, "type": 1, "ref": 1 }, { unique: true, collation: { locale: 'en', strength: 3 }});

db.getCollection('TestIndex').insert({ "name" : "A",
    "type" : "B",
    "ref" : "C"});
    //Inserted 1 record(s) in 11ms
db.getCollection('TestIndex').insert({ "name" : "A",
    "type" : "B",
    "ref" : "c"});

答案 1 :(得分:0)

@AlexBlex在评论中指出这是错误:https://jira.mongodb.org/browse/SERVER-26050

答案 2 :(得分:0)

最新发现

我发现,如果我的现有馆藏中已经有任何与创建索引一起崩溃的文档,则会出现相同的错误消息。然后,请先确认您没有无效的文档,然后再创建复合索引。


当我在选项参数中没有提供正确的索引名称时,我遇到了同样的问题。 MongoDB不允许我们使用重复的索引键进行创建,但是它将利用所涉及的字段和相应的值来创建索引名称(在本例中为name_1_type_1_ref_1)。 因此,我们需要在名称后加上后缀'_en'或其他后缀,以避免出现类似以下的重复错误。

db.collection('myCollection').createIndex(
      { "name": 1, "type": 1, "ref": 1 }, 
      { name: "name_1_type_1_ref_1_en", 
        unique: true, 
        collation: { locale: 'en', strength: 1 }
      }
);

然后可以成功创建复合索引。