2013-12-16 79 views
2

我讀過文檔以及其他堆棧溢出帖子,我只是無法弄清楚我在做什麼錯誤...這應該是一個簡單的驗證來檢查一個唯一的字符串,並根據該文檔和其他堆棧溢出文章,這應該引發一個錯誤,而不是保存重複的記錄。在這種情況下,它似乎根本不驗證...我在做簡單的Mongoose獨特驗證時做錯了什麼?

我已嘗試刪除整個集合並再次運行應用程序,以找到相同的行爲。

我按照this post中所述的推薦驗證方式進行驗證。

在此先感謝您的幫助。新的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控制檯:

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

回答

1

解決方案:

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

您也可以單獨創建安裝階段分貝,這是使用前有指標的最佳途徑。

0

天哪,我更撞頭後想通了這一點。

問題是所有的命令都是異步發生的!

這是正在發生的事情:

  1. 設置在貓鼬的模式將在「桶」的收集與「名稱」唯一索引運行ensureIndex(這在後臺運行和2號之前不會完成運行)。
  2. 在桶上運行插入。這寫入數據庫和INVALIDATES號碼1.因此,號碼1實際上失敗創建索引。所以第3次運行...
  3. 在同名桶上運行插入 - 不再有唯一的索引,因此它將寫入。

在開始嘗試寫入之前,您必須確保ensureIndex運行並實際上已創建索引。

利奧