MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Kendala unik MongoDB/Mongoose pada bidang Tanggal

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Konversi array JSON menjadi array multi dimensi

  2. Database menggunakan JSON sebagai format penyimpanan/transportasi

  3. Nilai kenaikan Mongodb di dalam array bersarang

  4. MongoDB 2.4.1 Sekarang Tersedia di ScaleGrid

  5. jelaskan() di Mongodb:perbedaan antara nscanned dan nscannedObjects