E11000 индекс повторяющегося ключа ошибки: необычная ошибка MongoDb - PullRequest
8 голосов
/ 27 декабря 2011

У меня есть простая коллекция "пользователей", внутри которой у меня сейчас только 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: db.users. $ Email_id dup key: {: 46}». Я получаю ту же ошибку даже после указания {dropDups: true}, однако я не думаю, что это так, поскольку оба документа имеют разные идентификаторы электронной почты.

Я не уверен, что здесь происходит, любые указатели будут с благодарностью.

Редактировать: Полный просмотр документов:

{
"_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», «istered_since »и т. Д., Которые я пропустил на приведенном выше дисплее (я не думаю, что они играют какую-либо роль в появлении ошибки, если они все еще нужны, я могу вероятно, вставьте сюда все документы)

Я использую erlang mongodb driver для связи с моим экземпляром mongo. Все поля, которые можно увидеть, сохраняются в виде двоичных байтов, поэтому вы видите такой странный email_id в документе.

Примечание. Бинарный формат бинарного кода не навязывается моей логикой кода, я очень сильно передаю строку email_id внутри моих документов bson, но в итоге я всегда вижу свои данные в виде двоичных байтов. (Возможно, потому, что как написан драйвер erlang mongodb, я на самом деле не исследовал это, так как мои запросы find (), find_one () и другие запросы работают, как и ожидалось, даже с полями, сохраненными в виде двоичных байтов)

Редактировать:> db.users.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 ]

5 голосов
/ 28 декабря 2011

Когда MongoDB индексирует поле массива, он фактически индексирует отдельные элементы в массиве.Это необходимо для эффективной поддержки запросов, ищущих определенный элемент массива, например:

db.users.find({email_id: 46})

Поскольку этот email_id (46) существует в обоих документах, в вашем уникальном индексе есть дублирующиеся ключи.

Я не уверен, почему вы получили бы эту ошибку, если у вас установлено dropDups: true ... Можете ли вы показать пример кода с тем, как вы вызываете createIndex?Вам также следует попробовать dropDups: 1, так как MongoDB ошибочно трактует 1 и true по-разному в этом контексте (см. https://jira.mongodb.org/browse/SERVER-4562).

0 голосов
/ 10 июня 2015

Для других, имеющих эту проблему, проверьте свою версию Монго с db.version().Если вы работаете с Mongo 3 и пытаетесь использовать dropDups для удаления дубликатов, произойдет сбой, и вы получите эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...