Mongoose Уникальный индекс не работает! - PullRequest
72 голосов
/ 04 апреля 2011

Я пытаюсь позволить MongoDB обнаружить дублирующееся значение на основе его индекса. Я думаю, что это возможно в MongoDB, но через оболочку Mongoose все кажется сломанным. Так что-то вроде этого:

User = new Schema ({
  email: {type: String, index: {unique: true, dropDups: true}}
})

Я могу сохранить 2 пользователей с одним и тем же адресом электронной почты. Чёрт.

Та же проблема была высказана здесь: https://github.com/LearnBoost/mongoose/issues/56, но этот поток старый и ведет в никуда.

Пока я вручную звоню в БД, чтобы найти пользователя. Этот звонок не дорогой, так как «электронная почта» проиндексирована. Но все равно было бы неплохо разрешить исходную обработку.

У кого-нибудь есть решение этого вопроса?

Ответы [ 17 ]

1 голос
/ 17 декабря 2015

Вы также можете решить эту проблему, удалив индекс;

предположим, что вы хотите удалить уникальный индекс из коллекции users и поле username, введите:

db.users.dropIndex('username_1');

1 голос
/ 14 сентября 2017

Если таблица / коллекция пуста, то создайте уникальный индекс для поля:

db.<collection_name>.createIndex({'field':1}, {unique: true})

Если таблица / коллекция не пуста, отбросьте коллекцию и создайте индекс:

db.<collection_name>.drop()
db.<collection_name>.createIndex({'field':1}, {unique: true})

Теперь перезапустите mongoDB.

1 голос
/ 10 мая 2019

проверьте, что autoIndex в схеме имеет значение true, может быть установлено значение false (по умолчанию true) при использовании параметров mongoose.connect

0 голосов
/ 08 июля 2019

Когда я столкнулся с этой проблемой, я попытался удалить базу данных, многократно перезапуская сервер (nodemon), и ни один из приемов не работал вообще.В Robo 3T я нашел следующую работу:

  1. В Robo 3T дважды щелкните по базе данных, чтобы открыть коллекции
  2. Откройте коллекции, чтобы открыть соответствующую коллекцию.Убедитесь, что ваши коллекции пусты, для начала
  3. Щелкните правой кнопкой мыши на папке индексов.По умолчанию вы увидите _id_ по умолчанию.Теперь выберите Добавить индекс
  4. Выберите имя, скажем email для поля электронной почты, например
  5. Предоставить ключи в формате JSON.Например,

    {
       "email": 1
    }
    
  6. Установите флажок Уникальный

  7. Сохранить

Это позволит избежать дублирования электронных писем.в MongoDB.

0 голосов
/ 19 июня 2019

Я некоторое время сталкивался с той же проблемой и много занимался поиском, и решением для меня была функция createIndexes().

Хотелось бы, чтобы это помогло.

, поэтому код будетвот так.

User = new Schema ({
   email: {type: String, unique: true}
});
User.createIndexes();
0 голосов
/ 18 июня 2019

Вы можете определить свою схему как

User = new Schema ({
  email: {
      type: String,
      unique: true
  }
})

Но, возможно, это не сработает, когда документ уже существует, и после этого вы изменили схему пользователя.Вы можете создать индекс по электронной почте для этой коллекции пользователей, если не хотите удалять коллекцию.С помощью этой команды вы можете создать индекс по электронной почте.

db.User.createIndex({email:1},{unique: true})

Или вы можете просто удалить коллекцию и снова добавить пользователя.
Для удаления коллекции вы можете ввести это:

db.User.drop()
0 голосов
/ 18 августа 2018

Если вы используете опцию autoIndex: false в способе подключения следующим образом:

mongoose.connect(CONNECTION_STRING, { autoIndex: false });

Попробуйте удалить это.Если это не сработает, попробуйте перезапустить mongodb , как предлагалось в этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...