MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Contrainte unique MongoDB/Mongoose sur le champ Date

Il semble que vous ayez déjà des valeurs en double avant d'apporter cette modification.

Voici un cas test. Ayez deux documents dans votre collection comme celui-ci avant de déployer un index :

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

Puis avec le listing de base :

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

      });

    });

Vous verrez que les deux documents sont ajoutés. Mais le problème ici est que l'index ne s'est pas déployé car cela a provoqué une erreur que vous n'avez pas vue. Vous pouvez vérifier cela dans le shell.

db.changes.getIndicies()

Ce qui montrera que votre index unique n'a pas été créé :

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

Si vous avez recommencé et n'aviez qu'un seul document de l'original

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

Ensuite, l'exemple de code ci-dessus crée l'index et produit une erreur dans la deuxième insertion :

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

L'index s'est bien créé cette fois :

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

Vous devrez parcourir vos données pour supprimer les doublons existants ou simplement accepter l'utilisation du dropDups option pour les supprimer automatiquement pour vous.

Voir également le didacticiel de documentation :Créer un index unique