Lewis
Lewis

Reputation: 5879

Unique index not working with Mongoose / MongoDB

I've got a problem with creating unique indexes using Mongoose / MongoDb and can't get it to work. I'm able to add two documents with the same attribute values when I have set a unique index.

I've tried everything I can think of - restarting (everything) changing the syntax etc.

Code

Addtion >>

This is the method that I'm using to save an entity:

  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);
    });
  }...

<<

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

Mongo output

 [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

When I checked in MongoHub the indexes don't appear, so they don't look like they have been created.

This is a duplicate of this question, but it doesn't have an answer that works for me.

Upvotes: 10

Views: 6428

Answers (3)

Khanh Tran
Khanh Tran

Reputation: 1826

Since you want to apply unique index in your collection, I suggest you to delete any duplicate documents. Here is the code for doing it:

In Mongo shell client:

db.agencies.ensureIndex({name: 1}, {unique: true, dropDups: true});
db.agencies.ensureIndex({url: 1}, {unique: true, dropDups: true});

Upvotes: 3

Victor Powell
Victor Powell

Reputation: 83

one solution that doesn't involve erasing your db, is to remove any duplicates manually, then run something along the lines of:

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

from the mongo shell

Upvotes: 8

Mike Scott
Mike Scott

Reputation: 4795

It looks as though the indexes are failing to create because there's already duplicate data in the MongoDB collection. If possible, try deleting all the data and start again with an empty collection.

Upvotes: 5

Related Questions