MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Hạn chế duy nhất MongoDB / Mongoose trên trường Ngày

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để chuyển đổi cấu trúc đối tượng JSON sang ký hiệu dấu chấm?

  2. Lỗi kết nối Mongodb bên trong vùng chứa docker

  3. MongoDB - Nhiều $ hoặc các phép toán

  4. Làm thế nào để Nhóm mongodb - mapReduce đầu ra?

  5. Cập nhật nhiều tài liệu theo bộ id. Mongoose