Уникальный составной текстовый индекс Mongo

Я пытаюсь создать индекс Mongo с двумя текстовыми полями, при этом любое поле может иметь значение в другом документе, но одна и та же пара не может. Я знаком с этой концепцией в MySQL, но не понимаю его в монго.

Я хотел бы создать уникальный индекс для полей symbol и date этих документов:

db.earnings_quotes.insert({"symbol":"UNF","date":"2017-01-04","quote":{"price": 5000}});

db.earnings_quotes.createIndex({symbol: 'text', date: 'text'}, {unique: true})

db.earnings_quotes.insert({symbol: 'HAL', date: '2018-01-22', quote: { "price": 10000 }});
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: sample.earnings_quotes.$symbol_text_date_text  dup key: { : \"01\", : 0.6666666666666666 }"
        }
})

Я не понимаю сообщение об ошибке здесь... В этом случае ни symbol, ни date не пересекаются с первой записью.


person quickshiftin    schedule 16.08.2019    source источник


Ответы (2)


text index на самом деле ведет себя немного как multikey index, он пытается разрезать текст на биты, которые затем могут быть запрошены с помощью определенных операторов текстового поиска. Кроме того, порядок полей в индексе text на самом деле не имеет значения (по сравнению с обычным составным индексом), MongoDB просто просматривает все значения как в symbol, так и в date и индексирует их отдельно.

В этом случае я считаю, что монго пытается индексировать 01 в 2017 и 01 в -01- отдельно.

Я не думаю, что в вашем случае вы действительно хотите делать текстовый индекс, он создан для поиска по длинным текстам, а не по полям с одиночными значениями в них.

Кроме того, мультиключевой характер индекса text делает очень сложным сохранение уникальности.

Мой совет: действуйте так: db.earnings_quotes.createIndex({symbol: 1, date: 1}, {unique: true})

person Ptijohn    schedule 16.08.2019
comment
Хорошо, спасибо. Внесение этих изменений и выполнение некоторых тестовых вставок, похоже, ведет себя так, как ожидалось. - person quickshiftin; 16.08.2019

По умолчанию монго использует _id в качестве уникального ключа и индекса, поэтому одним из решений вашей проблемы является сохранение ваших данных в поле _id.

e.g:

{
    "_id":{
            "symbol" :"xyz" ,
            "date" :"12-12-20" ,
        }

        //Other fields in collection
}

Это создаст составной ключ.

person USMAN FAZIL    schedule 19.03.2020