sql >> Base de Datos >  >> NoSQL >> MongoDB

Restricción única de MongoDB/Mongoose en el campo Fecha

Parece que ya tenía valores duplicados antes de realizar este cambio.

Aquí hay un caso de prueba. Tenga dos documentos en su colección como este antes de implementar un índice:

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

Luego con la lista básica:

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

      });

    });

Verá que se agregan ambos documentos. Pero la cosa aquí es que el índice no se implementó porque eso causó un error que no viste. Puede verificar esto en el shell.

db.changes.getIndicies()

Lo que mostrará que su índice único no se creó:

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

Si comenzó de nuevo y solo tenía un documento del original

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

Luego, el ejemplo de código anterior crea el índice y produce un error en la segunda inserción:

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

El índice creado correctamente esta vez:

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

Deberá revisar sus datos para eliminar los duplicados existentes o simplemente aceptar el uso de dropDups opción para eliminarlos automáticamente por usted.

Consulte también el tutorial de documentación:Crear un índice único