我使用以下索引创建了一个集合。只有名称是字符串类型,并且应该以不区分大小写的方式进行检查。只允许“ 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键部分是什么意思?这是正确的方法吗?
答案 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 }
}
);
然后可以成功创建复合索引。