web-dev-qa-db-fra.com

Mongoose en double avec la clé de schéma unique

Je veux rendre le projet clé unique à travers cette collection mais je ne peux pas faire fonctionner cela, j'ai trouvé un problème similaire ici.

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

Lorsque j'exécute l'application avec node test.js, crée toujours des doublons.

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

// Modifier toujours le même problème, voici ce que j'ai essayé de faire supprimer la collection db.tasks.drop () redémarrer mongo Sudo arrêter mongodb et redémarrer mongodb, exécuter à nouveau le programme et toujours le même problème, comment permet-il la duplication des données sur l'index?

22
Risto Novik

L'objet Schema que vous passez peut ne pas fonctionner correctement car vous imbriquez l'attribut "unique" dans l'attribut "index", essayez quelque chose comme ça (cela fonctionne comme prévu):

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

Ou plus précisément pour votre exemple:

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

Remarque: je ne sais pas ce que vous essayez de faire avec le paramètre "dropDups", il ne semble pas être dans la documentation mangouste .

30
Arnaud Rinquin