Обновление уникальных составных индексов для существующего набора данных - PullRequest
0 голосов
/ 13 мая 2019

Проблема:

Я пытаюсь обновить уникальный составной индекс для существующего набора данных, а Mongo не обновляет индекс.

Справочная информация:

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

Я занимаюсь обновлением этого индекса, чтобы пользователи могли обмениваться электронными сообщениями. Мы добавили новое свойство в пользовательскую модель под названием «primaryAccountHolder». Я хочу, чтобы новый составной индекс позволял пользователям с одним и тем же clubID обмениваться сообщениями электронной почты, но только для одного пользователя в одном клубе поле primaryAccountHolder могло быть установлено в значение true. У меня этот индекс работает локально, но обновление нашего существующего набора данных не выполнено.

Я считаю, что это потому, что у нас есть записи в нашей БД, которые не позволяют обновлять этот индекс. Итак, мой вопрос: Как я могу добиться обновления составного индекса, который поддерживает уникальность существующего набора данных? Ниже приведены индексы, которые я создал, используя Mongoose / Typescript. Они работают локально, но не на нашей существующей базе данных.

Старый указатель:

UserSchema.index ({электронная почта: 1, clubID: 1}, {unique: true})

// Не разрешать пользователю одного и того же клуба иметь один и тот же адрес электронной почты. Это индекс нашей БД.

Новый индекс:

UserSchema.index ({электронная почта: 1, clubID: 1}, {уникальное: true, частичноеFilterExpression: {электронное письмо: {$ exist: true}, primaryAccountHolder: {$ eq: true}}})

// Разрешит пользователям делиться электронной почтой, но только одному из них может быть присвоено значение true для основного поля владельца учетной записи.

Новый индекс использует выражение частичного фильтра. Эта часть не создана в существующем наборе данных.

Спасибо за помощь!

Сэм Груз

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вам придется удалить и заново создать индекс:

UserSchema.dropIndex({ email: 1, clubID: 1 })

А затем воссоздать его:

UserSchema.createIndex(
    { email: 1, clubID: 1 }, 
    { unique: true, 
        partialFilterExpression: 
        { email: { $exists: true },primaryAccountHolder: { $eq: true } }}
)

от MongoDB Документация: https://docs.mongodb.com/manual/tutorial/manage-indexes/#modify-an-index

0 голосов
/ 13 мая 2019

MongoDB не может обновить существующий индекс. Вам нужно удалить текущий индекс и создать новый.

С https://docs.mongodb.com/manual/tutorial/manage-indexes/#modify-an-index:

Чтобы изменить существующий индекс, вам нужно удалить и заново создать индекс. Исключением из этого правила являются индексы TTL, которые можно изменить с помощью команды collMod в сочетании с флагом сбора индексов.

...