E11000 duplicate key error index: необычная ошибка MongoDb
у меня есть простая коллекция "пользователи", внутри которой сейчас у меня есть только 2 документа.
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
теперь, если я попытаюсь создать новый индекс с {unique: true} в поле email_id, mongodb жалуется мне на "e11000 duplicate key error index: db.пользователи.$email_id ДУП ключ: { : 46 }". Я получаю ту же ошибку даже после указания {dropDups: true}, однако я не думаю, что это так, поскольку оба документа имеют разные идентификаторы электронной почты.
Я не уверен, что происходит здесь любые указатели будут очень оценены.
Edit: полный просмотр документов:
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
"4": 98,
"5": 104,
"6": 105,
"7": 110,
"8": 97,
"9": 118,
"10": 115,
"11": 105,
"12": 110,
"13": 103,
"14": 104,
"15": 46,
"16": 99,
"17": 111,
"18": 109
}
}
и
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
"4": 115,
"5": 102,
"6": 111,
"7": 114,
"8": 97,
"9": 98,
"10": 104,
"11": 105,
"12": 110,
"13": 97,
"14": 118,
"15": 64,
"16": 103,
"17": 109,
"18": 97,
"19": 105,
"20": 108,
"21": 46,
"22": 99,
"23": 111,
"24": 109
}
}
есть еще несколько полей, таких как" display_name"," registered_since " и т. д., которые я опустил с дисплея выше (я не думаю, что у них есть какая-либо роль в ошибке, если они вам все еще нужны, я, вероятно, могу вставить все документы здесь)
Я использую водитель Эрланг монгодб для общение с моим экземпляром mongo. Все поля, как видно, сохраняются как двоичные байты, поэтому вы видите такой странный email_id в документе.
Примечание: двоичный формат байта не принуждается моей логикой кода, я очень передаю строку email_id внутри моих документов bson, но я всегда вижу свои данные как двоичные байты. (Вероятно, потому, что как написан драйвер erlang mongodb, я действительно не исследовал это, так как мои find (), find_one () и другие запросы работают так, как ожидалось даже с поля, сохраненные как двоичные байты)
Edit: > db.пользователи.findOne()
{
"_id" : ObjectId("4ef6d2641d41c83bdd000001"),
"email_id" : [
109,
97,
105,
108,
115,
102,
111,
114,
97,
98,
104,
105,
110,
97,
118,
64,
103,
109,
97,
105,
108,
46,
99,
111,
109
],
"display_name" : [
65,
98,
104,
105,
110,
97,
118,
43,
83,
105,
110,
103,
104
],
"provider" : [
106,
97,
120,
108,
46,
105,
109
],
"provider_id" : [ ]
}
2 ответов
когда MongoDB индексирует поле массива, он фактически индексирует отдельные элементы в массиве. Это необходимо для эффективной поддержки запросов, ищущих конкретный элемент массива, например:
db.users.find({email_id: 46})
после этого email_id
(46) существует в обоих документах, в вашем уникальном индексе есть дубликаты ключей.
Я не уверен, почему вы получаете эту ошибку, если у вас есть dropDups: true
set... можете ли вы показать пример кода, как вы вызываете createIndex
? Вы также должны попробовать dropDups: 1
, как MongoDB ошибочно воспринимает 1
и true
по-разному в этом контексте (см. https://jira.mongodb.org/browse/SERVER-4562).
для других, имеющих эту проблему, проверьте версию mongo с db.version()
. Если вы используете Mongo 3 и пытаетесь использовать dropDups для очистки дубликатов, он потерпит неудачу и даст вам эту ошибку.