Có vẻ như bạn đã có các giá trị trùng lặp trước khi thực hiện thay đổi này.
Đây là một trường hợp thử nghiệm. Có hai tài liệu trong bộ sưu tập của bạn như thế này trước khi bạn triển khai chỉ mục:
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
Sau đó, với danh sách cơ bản:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var stateChange = mongoose.Schema({
timestamp: { type: Date, required: true, unique: true }
});
var Change = mongoose.model( 'Change', stateChange );
var date = new Date();
var change = new Change({
timestamp: date
});
change.save(function(err,change) {
if ( err )
throw err;
console.log( change );
var new_change = new Change({
timestamp: date
});
new_change.save(function(err,change) {
if ( err )
throw err;
console.log( change );
});
});
Bạn sẽ thấy cả hai tài liệu được thêm vào. Nhưng vấn đề ở đây là chỉ mục đã không triển khai vì điều đó gây ra lỗi bạn không thấy. Bạn có thể kiểm tra điều này trong shell.
db.changes.getIndicies()
Điều này sẽ cho thấy chỉ mục duy nhất của bạn chưa được tạo:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.changes"
}
]
Nếu bạn bắt đầu lại và chỉ có một tài liệu từ tài liệu gốc
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
Sau đó, mẫu mã ở trên tạo chỉ mục và tạo ra lỗi trong lần chèn thứ hai:
{ __v: 0,
timestamp: Mon Jun 02 2014 14:29:44 GMT+1000 (EST),
_id: 538bfdb8961376867ae42e61 }
/xxxxx/node_modules/mongoose/lib/utils.js:413
throw err;
^
MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.changes.$timestamp_1 dup key: { : new Date(1401683384647) }
Chỉ mục được tạo đúng cách lần này:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.changes"
},
{
"v" : 1,
"unique" : true,
"key" : {
"timestamp" : 1
},
"name" : "timestamp_1",
"ns" : "test.changes",
"background" : true,
"safe" : null
}
]
Bạn sẽ cần xem xét dữ liệu của mình để xóa các bản sao hiện có hoặc chỉ chấp nhận việc sử dụng dropDups
tùy chọn để tự động xóa chúng cho bạn.
Ngoài ra, hãy xem hướng dẫn tài liệu: Tạo chỉ mục duy nhất