我在做简单的Mongoose独特的validation错了什么?

我已经阅读了文档以及其他堆栈溢出post,我只是无法弄清楚我在做什么错在这里…这应该是一个简单的validation检查一个唯一的string,并根据文档和其他堆栈溢出的文章,这应该引发一个错误,而不是保存重复的logging。 在这种情况下,它似乎根本不validation…

我已经尝试删除整个集合,并再次运行应用程序只发现相同的行为。

我按照本文所述的推荐的validation方式进行validation。

预先感谢帮助我。 新的NodeJS。

bucket.js:

var mongoose = require('mongoose'); var Schema = mongoose.Schema; var bucketSchema = new Schema({ name: { type: String, index: true, required: true, unique: true, trim: true }, created_at: { type: Date, default: Date.now } }); var Bucket = mongoose.model('Bucket', bucketSchema); module.exports = Bucket; 

app.js

 var mongoose = require('mongoose'); // Require data models var Bucket = require('./models/bucket.js'); // Connect to database mongoose.connect("mongodb://localhost/tritonia"); mongoose.set('debug' ,true); // Test var bucket = new Bucket({ name: "foo" }); bucket.save(function(err) { if (err) { console.log(err); } else { console.log("Saved"); } }); var bucket2 = new Bucket({ name: "foo" }); bucket2.save(function(err) { if (err) { console.log(err); } else { console.log("Test failed: It should not save a second bucket named 'foo'"); } }) 

输出:

 Express server listening on port 3000 Mongoose: buckets.ensureIndex({ name: 1 }) { safe: undefined, background: true, unique: true } Mongoose: buckets.insert({ __v: 0, created_at: new Date("Mon, 16 Dec 2013 02:27:39 GMT"), _id: ObjectId("52ae651baabf290436000001"), name: 'foo' }) {} Mongoose: buckets.insert({ __v: 0, created_at: new Date("Mon, 16 Dec 2013 02:27:39 GMT"), _id: ObjectId("52ae651baabf290436000002"), name: 'foo' }) {} Saved Test failed: It should not save a second bucket named 'foo' 

数据库控制台

 > db.buckets.find() { "name" : "foo", "_id" : ObjectId("52ae6427a58628cd34000001"), "created_at" : ISODate("2013-12-16T02:23:35.052Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae6427a58628cd34000002"), "created_at" : ISODate("2013-12-16T02:23:35.056Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae6447d0ac5a0e35000001"), "created_at" : ISODate("2013-12-16T02:24:07.413Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae6447d0ac5a0e35000002"), "created_at" : ISODate("2013-12-16T02:24:07.416Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae64f02876b7d535000001"), "created_at" : ISODate("2013-12-16T02:26:56.642Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae64f02876b7d535000002"), "created_at" : ISODate("2013-12-16T02:26:56.645Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae650caeda67f435000001"), "created_at" : ISODate("2013-12-16T02:27:24.646Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae650caeda67f435000002"), "created_at" : ISODate("2013-12-16T02:27:24.689Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae651baabf290436000001"), "created_at" : ISODate("2013-12-16T02:27:39.136Z"), "__v" : 0 } { "name" : "foo", "_id" : ObjectId("52ae651baabf290436000002"), "created_at" : ISODate("2013-12-16T02:27:39.140Z"), "__v" : 0 } 

解:

 var Bucket = mongoose.model('Bucket', bucketSchema); Bucket.on('index', function() { new Bucket({}).save(); new Bucket({}).save(); new Bucket({}).save(); new Bucket({}).save(); }) 

你也可以在安装阶段分开创build数据库,这是使用前有索引的最好方法。

哦,我经过了很多人的抨击后才知道这一点。

问题是所有的命令都是asynchronous发生的!

这是发生了什么事情:

  1. 在Mongoose中设置模式将运行“桶”集合上的唯一索引上的ensureIndex(这在后台运行,并且在数字2运行之前不会完成)。
  2. 在桶上运行插入。 这写入数据库和INVALIDATES号码1.因此,号码1实际上失败创build索引。 所以3号跑…
  3. 在相同名称的桶上运行插入 – 不再有唯一的索引,因此它将写入。

您必须确保ensureIndex运行并实际上在您开始尝试写入索引之前创build索引。

狮子座