Вопрос по indexing, mongoose, mongodb, unique, sparse-matrix – Mongodb уникальный разреженный индекс

8

Я создал редкий и уникальный индекс для моей коллекции mongodb.

var Account = new Schema({
                email: { type: String, index: {unique: true, sparse: true} },
                        ....

Он был создан правильно:

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null }

Но если я вставляю второй документ с не установленным ключом, я получаю эту ошибку:

{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1  dup key: { : null }]
  name: 'MongoError',
  err: 'E11000 duplicate key error index: MyDB.accounts.$email_1  dup key: { : null }',
  code: 11000,
  n: 0,
  ok: 1 }

Есть намеки?

@MicheleSpina: используйте mongosniff, чтобы проверить, какие запросы поступают в mongod, и посмотреть, содержит ли запрос пустое поле электронной почты. Я уверен, что должны быть некоторые новые вставки документов с нулевым полем электронной почты. После этого вы можете легко отладить, кто отправляет эти запросы. Abhishek Kumar
Установивemail вunique, Это's должен быть уникальным для каждого документа в коллекции. Только одинnull значение для примера. Итак, это звучит какработает как положено. WiredPrairie
Можете ли вы проверить в коллекции, если есть какой-либо документ сноль' для поля электронной почты. Может случиться так, что используемый вами шаблонизатор вставляет в это поле пустое значение. Я проверяю локально, все работает нормально. Abhishek Kumar
@Abhishek Kumar Я использую Mongoose. Видимо кажется, что это не• создать поле электронной почты, потому что оно отсутствует в документе. Но если я буду искать с помощью командыdb.collection.find({email: null}) Я нахожу один объект! Это довольно странно! Есть намеки? Michele Spina
Просто ответил на этот вопрос:stackoverflow.com/questions/17114851/...  -- Это'Очень похожая (и, вероятно, та же самая) проблема. WiredPrairie

Ваш Ответ

1   ответ
16

чтобы значение было либо нулевым, либо уникальным. Итак, я установил обаunique иsparse флаги:

var UserSchema = new Schema({
  // ...
  email: {type: String, default: null, trim: true, unique: true, sparse: true},
  // ...
});

И я убедился, что база данных действительно создала индекс правильно сdb.users.getIndexes();

{
  "v" : 1,
  "key" : {
    "email" : 1
  },
  "unique" : true,
  "ns" : "test.users",
  "name" : "email_1",
  "sparse" : true,
  "background" : true,
  "safe" : null
},

(Так что этоне так же, как проблема здесь:ошибка повторяющегося ключа в поле mongo _id)

Моя ошибка была установкаdefault значение дляnull, В каком-то смысле Mongoose считает явноеnull как значение, которое должно быть уникальным. Если поле никогда не определяется (илиundefined) тогда он не обязательно должен быть уникальным.

email: {type: String, trim: true, unique: true, sparse: true},

Так что, если у вас тоже есть эта проблема, убедитесь, что выне устанавливайте значения по умолчанию и убедитесь, чтоне устанавливать значения вnull где-нибудь еще в вашем коде. Вместо этого, если вам нужно установить его явно, установите его наundefined (или уникальное значение).

$unsetполе работает так же хорошо, если выпереходит из состояния, когда поле должно быть уникальным, в состояние, в котором вы незаботиться о поле. elhefe

Похожие вопросы