2012-01-26 30 views
19

Quiero hacer que el proyecto clave sea único en toda esa colección, pero no puedo conseguir que esto funcione, encontré un problema similar aquí.Mongoose se duplica con la clave de esquema única

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(); 

cuando corro la aplicación con Test.js nodo, sigue creando duplicados.

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") } 

// Editar todavía mismo problema, esto es lo que traté de hacer eliminar la colección db.tasks.drop() reinicio parada mongo sudo mongodb y empezar mongodb, corriendo el programa de nuevo y todavía mismo problema, ¿cómo permite datos duplicados en el índice?

Respuesta

22

El objeto de esquema que está pasando puede no funcionar correctamente debido a que están anidando 'único' atribuir a 'índice' atributo, intentar algo como esto (que funciona como está previsto):

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

O más específicamente por su ejemplo:

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

Nota: no sé lo que estás tratando de hacer con el parámetro "dropDups", no parece estar en la mongoose documentation.

+6

dropDups es de mongodb-native – jackdbernier

+1

dropDups está en desuso desde la versión 2.6 https://docs.mongodb.com/v2.6/tutorial/create-a-unique-index/#drop-duplicates –

Cuestiones relacionadas