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 для очистки дубликатов, он потерпит неудачу и даст вам эту ошибку.