У меня есть такая схема пользователя, когда пользователь регистрируется, я хочу установить значение по умолчанию как нулевое, но также иметь возможность установить это значение как уникальное. Пробовал решение из этого сообщение
Я буквально скопировал то же решение, но все еще получаю эту ошибку.
MongoError: E11000 duplicate key error index: ppp-ng-dev.users.$mobile_1 dup key: { : null }
Моя схема
const userSchema = new Schema({
mobile: {
type: Number,
required: false,
index: {
unique: true,
partialFilterExpression: {mobile: {$exists: true }}
},
default: null,
},
})
Почему я получаю эту ошибку, даже если синтаксис правильный? (видимо)
Проблема в том, что в коллекции есть несколько документов со значением null
для поля mobile
. Это нарушает ограничение уникальности указанного индекса. Как отметил JohnnyHK в билете, который вы связали:
Note that a unique, sparse index still does not allow multiple docs with an email field with a value of null, only multiple docs without an email field.
В вашем конкретном случае partialFilterExpression
указывает индексировать только документы, в которых существует поле mobile
, включая документы, в которых поле определено и явно определено как null
.
Я не могу протестировать это прямо сейчас, но вы можете захотеть использовать partialFilterExpression для $type
вместо $exists: true
. Это исключит нулевые значения и проиндексирует только определенные значения. Я не уверен, какой базовый тип BSON будет использоваться для Number
в Mongoose, поэтому вы можете изучить это и, возможно, вместо этого рассмотреть возможность хранения в виде строки.
Я получаю те же ошибки, даже если ни один документ не имеет mobile
явно установленного значения null.
Спасибо за ответ! Итак, есть ли способ разрешить сохранение нулевых значений в поле
mobile
при сохранении уникальности поля?