Уникальный индекс не работает с Mongoose / MongoDB - PullRequest
9 голосов
/ 08 мая 2011

У меня проблема с созданием уникальных индексов с использованием Mongoose / MongoDb, и я не могу заставить его работать. Я могу добавить два документа с одинаковыми значениями атрибута, когда я установил уникальный индекс.

Я перепробовал все, что мог придумать - перезапустить (все), изменить синтаксис и т. Д.

код

Дополнение >>

Это метод, который я использую для сохранения сущности:

  create  : function(entity, definition, successFn, errorFn){

    var model = mongoose.model(entity);
    newModel = new model(definition);

    newModel.save(function(error) {
      if(error){
        if(!errorFn){
          throw error;
        }
        errorFn(newModel);
        return;
      }

      successFn(newModel);
    });
  }...

<< </p>

var Something = new Schema({
  objectId          : ObjectId,
  name              : { type : String, index: { unique: true }}, 
  url               : { type : String, index: { unique: true }},
...etc
mongoose.model('Something', Something);

Монго вывод

 [conn1] insert xxxxx.agencies 1526ms
 [conn1] building new index on { name: 1 } for xxxxx.agencies
 [conn1] insert xxxxx.system.indexes exception 11000 E11000 duplicate key error    index: xxxxx.agencies.$name_1  dup key: { : "something" } 4ms
 [conn1] building new index on { url: 1 } for xxxxx.agencies
 [conn1] insert xxxxx.system.indexes exception 11000 E11000 duplicate key error index: xxxxx.agencies.$url_1  dup key: { : "http://www.something.com" } 1ms

Когда я зарегистрировался в MongoHub, индексы не отображаются, поэтому они не выглядят так, как будто они были созданы.

Это дубликат этого вопроса , но у него нет ответа, который мне подходит.

Ответы [ 3 ]

8 голосов
/ 26 октября 2012

Одно из решений, которое не требует удаления вашей базы данных, - это удалить любые дубликаты вручную, а затем выполнить что-то вроде:

db.users.ensureIndex({email:1},{unique:true,sparse:true});

из оболочки монго

5 голосов
/ 08 мая 2011

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

3 голосов
/ 07 ноября 2013

Поскольку вы хотите применить уникальный индекс в своей коллекции, я предлагаю вам удалить любые дубликаты документов.Вот код для этого:

В клиенте оболочки Mongo:

db.agencies.ensureIndex({name: 1}, {unique: true, dropDups: true});
db.agencies.ensureIndex({url: 1}, {unique: true, dropDups: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...