MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Vincolo univoco MongoDB/Mongoose sul campo Data

Sembra che avevi già valori duplicati prima di apportare questa modifica.

Ecco un caso di prova. Avere due documenti nella tua raccolta come questo prima di distribuire un indice:

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

Quindi con l'elenco di 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 );

      });

    });

Vedrai che entrambi i documenti sono stati aggiunti. Ma il problema qui è che l'indice non è stato distribuito perché ha causato un errore che non hai visto. Puoi verificarlo nella shell.

db.changes.getIndicies()

Ciò mostrerà che il tuo indice univoco non è stato creato:

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

Se hai ricominciato e avevi solo un documento dall'originale

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

Quindi l'esempio di codice sopra crea l'indice e produce un errore nel secondo inserto:

{ __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'indice creato correttamente questa volta:

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

Dovrai esaminare i tuoi dati per rimuovere i duplicati esistenti o semplicemente accettare l'utilizzo di dropDups opzione per rimuoverli automaticamente per te.

Consulta anche il tutorial sulla documentazione:Crea un indice unico