Node.js – Mongoose duplicates with the schema key unique

mongoosenode.js

I want to make the key project unique across that collection but i cant getting this working, i found similar problem here.

task.js

function make(Schema, mongoose) {

    var Tasks = new Schema({
        project: { type: String, index: { unique: true, dropDups: true }},
        description: String
    });

    mongoose.model('Task', Tasks);
}
module.exports.make = make;

test.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/rss');

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

require('./task.js').make(Schema, mongoose);
var Task = mongoose.model('Task');
var newTask = new Task({
    project: 'Starting new project'
  , description: 'New project in node'
});
newTask.save(function(err) {
    if (err) console.log('Error on saving');
});

mongoose.disconnect();

When i run the app with node test.js, still creates duplicates.

MongoDB shell version: 2.0.2
connecting to: rss
> db.tasks.find()
> db.tasks.find()
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa3d48d4e1533000001") }
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa4d9a8921a33000001") }
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa57ebeea1f33000001") }

// Edit still same problem, here's what i tried to do
delete the db.tasks.drop() collection
restart mongo sudo stop mongodb and start mongodb, ran the program again and still same problem, how does it allow duplicate data on index?

Best Solution

The Schema object you're passing may not work correctly because you are nesting 'unique' attribute into 'index' attribute, try something like this (it works as intended) :

User = mongoose.model('User', new Schema({
    firstName:  {
        type:String,
        required: true,
    },
    lastName: {
        type:String,
        required: true,
    },
    email: {
        type:String,
        required: true,
        unique: true
    },
    address: String,
    phone: {
        type:String,
        required: true,
    },
    password:  {
        type:String,
        required: true,
        set: Data.prototype.saltySha1 // some function called before saving the data
    },
    role: String
},{strict: true}));

Or more specifically for your example :

var Tasks = new Schema({
    project: { 
        type: String, 
        unique: true,
        index: true
    },
    description: String
});

Note : I don't know what you're trying to do with the "dropDups" parameter, it doesn't seems to be in the mongoose documentation.

Related Question