2014-12-08 6 views
3

почему мангуст уникальный не работает в этом сценариимангуст уникален: правда не работает

var child_process = require('child_process'); 
    // Load required packages 
    child_process.exec("mongo test --eval 'db.users.drop();'", function(err){ 
    var mongoose = require('mongoose'); 

    console.log(mongoose.version); 
    mongoose.connect('mongodb://localhost:27017/test'); 
    // Define our user schema 

    var json = {}; 
    json.phone = { type: String, required: true, unique: true}; 
    var UserSchema = new mongoose.Schema(json); 
    var Model = mongoose.model('user', UserSchema); 

    var jp = new Model({ phone: "123456"}); 
    mongoose.connection.on('open', function(){ 
    console.log(jp); 
    jp.save(function(err){ 
     console.log(err); 
     var jp2 = new Model({ phone: "123456"}); 
     console.log(jp2); 
     jp2.save(function(err){ 
     console.log(err); 
     process.exit(); 
     }); 
    }) 
    }); 
}); 

Я совершенно запутался, результат как

3.8.20 
{ phone: '123456', _id: 54856cceb5b40f7a88fcc2af } 
null 
{ phone: '123456', _id: 54856cceb5b40f7a88fcc2b0 } 
null 

Спасибо за вашу помощь.

ответ

10

Это происходит потому, что вы сохраняете дублированный документ до того, как mongoose закончил создание индекса. Mongoose создает индексы на ходу после запуска вашего приложения.

Итак, чтобы ваш документ сохранялся только после создания индексов, вам необходимо прослушать событие index вашей модели. Например:

Model.on('index', function (error) { 
    console.log(jp); 
    jp.save(function(err){ 
    console.log(err); 
    var jp2 = new Model({ phone: "123456"}); 
    console.log(jp2); 
    jp2.save(function(err){ 
     console.log(err); 
     process.exit(); 
    }); 
    }) 
}); 

Теперь, когда вы пытаетесь сохранить второй документ (дублированный один), ваш MongoDB вызовет ошибку, потому что ваши save звонки будут просто работать после того, как были созданы индексы.

+1

Спасибо, это то, что я хочу. – SetupX

Смежные вопросы