sql >> データベース >  >> NoSQL >> MongoDB

日付フィールドのMongoDB/Mongoose一意制約

    この変更を行う前に、すでに重複した値があったようです。

    これがテストケースです。インデックスを展開する前に、コレクションに次の2つのドキュメントを用意してください。

    { "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
    { "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
    

    次に、基本的なリストを使用します:

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

    両方のドキュメントが追加されていることがわかります。ただし、ここで重要なのは、表示されないエラーが発生したためにインデックスがデプロイされなかったことです。これはシェルで確認できます。

    db.changes.getIndicies()
    

    一意のインデックスが作成されていないことが表示されます:

    [
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.changes"
        }
    ]
    

    もう一度やり直して、元のドキュメントが1つしかない場合

    { "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
    

    次に、上記のコードサンプルはインデックスを作成し、2番目の挿入でエラーを生成します:

    { __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) }
    

    今回は適切に作成されたインデックス:

    [
        {
                "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
        }
    ]
    

    データを調べて既存の重複を削除するか、 dropDups それらを自動的に削除するオプション。

    ドキュメントチュートリアルも参照してください:一意のインデックスを作成する




    1. _idを使用してmLabコレクションからオブジェクトを更新する方法

    2. Microsoft.Extensions.Cashing.RedisとMicrosoft.Extensions.Caching.StackExchangeRedis.RedisCacheの違い

    3. オブジェクト指向としてのJavaでのMongodb接続の管理

    4. 配列内の最大要素を見つける