Уникальный составной индекс для полей массива

Я пытаюсь создать документ mongo с составным индексом. Мой образец документа выглядит так

{fname: "fname1", lname: "lname1", задача: ["t11", "t12", "t13"]}

{fname: "fname2", lname: "lname2", задача: ["t21", "t22", "t23"]}

{fname: "fname3", lname: "lname3", task: ["t31", "t32", "t33"]}

И индекс, как показано ниже

createIndex ({fname: 1, lname: 1, task: 1}, {unique: true, name: 'some-index-name'})

Я ожидаю

В случае каких-либо изменений

  • fname ИЛИ
  • lname ИЛИ
  • задача (любое частичное изменение данных - хотя бы один элемент)

следует рассматривать как уникальный документ.

Я получаю исключение "Ошибка дублирования ключа E11000"

Я заглянул в падающие ссылки, но не смог понять.

Каковы ограничения частичных индексов?

https://docs.mongodb.com/manual/core/index-partial/ < / а>

https://docs.mongodb.com/manual/indexes/#create-an-index

База кодов Mongo: github.com/mongodb/mongo/blob/69dec2fe8fed6d32ec4998ea7ec7ab063cb5b788/src/mongo/db/catalog/index_catalog.cpp#L422


person Ramesh Papaganti    schedule 07.03.2018    source источник


Ответы (1)


Вы правы, что ограничения уникального индекса такие, как вы описали. Однако это верно только для поля единственного значения. Как только вы используете уникальный индекс для массива, это делает его уникальным + многоклавишным индексом.

По сути, когда вы создаете индекс для поля массива, MongoDB создает запись индекса для этого документа для каждого поля массива в нем. Это называется многоклавишным индексом.

Например, документ:

{a:1, b:[1, 2, 3]}

с индексом:

db.test.createIndex({a:1, b:1})

будет иметь три записи в индексе для каждого элемента массива b:

{a:1, b:1}
{a:1, b:2}
{a:1, b:3}

Поэтому, если вы создаете уникальный индекс для полей a и b:

db.test.createIndex({a:1, b:1}, {unique:true})

все эти вставки завершатся ошибкой с нарушением уникального индекса:

> db.test.insert({a:1, b:1})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }

> db.test.insert({a:1, b:2})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 2.0 }

> db.test.insert({a:1, b:3})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 3.0 }

> db.test.insert({a:1, b:[1]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }

> db.test.insert({a:1, b:[1,2]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }

> db.test.insert({a:1, b:[1,2,3]})
E11000 duplicate key error collection: test.test index: a_1_b_1 dup key: { : 1.0, : 1.0 }

Это причина, по которой вы не можете индексировать более одного поля массива в индексе. Если у вас есть несколько массивов, количество записей индекса будет произведением длины двух массивов. Ваш индекс может легко оказаться больше ваших данных, и сканирование такого большого индекса может занять значительное время.

person kevinadi    schedule 08.03.2018
comment
Не могли бы вы предоставить какую-либо официальную ссылку на документ, чтобы она была полезна для всех для лучшего понимания. Спасибо. - person Ramesh Papaganti; 08.03.2018
comment
@RameshPapaganti, официальная документация - docs.mongodb.com/manual/core/index-multikey интересен раздел "Примеры" внизу страницы. - person kevinadi; 09.03.2018