mongoose unique: true 不起作用

5

为什么在这个脚本中mongoose的唯一性校验完全不起作用?

  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

感谢您的帮助。
1个回答

13

这是因为你在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接