Reputation: 8295
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?
Upvotes: 34
Views: 85323
Reputation: 11
try this
const uniqueValidator = require('mongoose-unique-validator');
function make(Schema, mongoose) {
var Tasks = new Schema({
project: {
type: String,
index: {
unique: true,
dropDups: true
}
},
description: String
});
Tasks.plugin(uniqueValidator);
mongoose.model('Task', Tasks);
}
module.exports.make = make;
use unique validator
Upvotes: 1
Reputation: 4306
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.
Upvotes: 47