Sepertinya Anda sudah memiliki nilai duplikat sebelum melakukan perubahan ini.
Berikut ini adalah kasus uji. Miliki dua dokumen dalam koleksi Anda seperti ini sebelum Anda menerapkan indeks:
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
Kemudian dengan daftar dasar:
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 );
});
});
Anda akan melihat kedua dokumen ditambahkan. Tetapi masalahnya di sini adalah indeks tidak digunakan karena itu menyebabkan kesalahan yang tidak Anda lihat. Anda dapat memeriksa ini di shell.
db.changes.getIndicies()
Yang akan menunjukkan indeks unik Anda tidak dibuat:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.changes"
}
]
Jika Anda memulai lagi dan hanya memiliki satu dokumen dari
asli{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
Kemudian contoh kode di atas membuat indeks dan menghasilkan kesalahan pada sisipan kedua:
{ __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) }
Indeks dibuat dengan benar kali ini:
[
{
"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
}
]
Anda harus memeriksa data Anda untuk menghapus duplikat yang ada atau hanya menerima penggunaan dropDups
opsi untuk menghapusnya secara otomatis untuk Anda.
Lihat juga tutorial dokumentasi:Buat Indeks Unik