MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Restrição exclusiva do MongoDB/Mongoose no campo Data


Parece que você já tinha valores duplicados antes de fazer essa alteração.

Aqui está um caso de teste. Tenha dois documentos em sua coleção como este antes de implantar um índice:
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }

Em seguida, com a listagem 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 );

      });

    });

Você verá que ambos os documentos foram adicionados. Mas o problema aqui é que o índice não foi implantado porque isso causou um erro que você não viu. Você pode verificar isso no shell.
db.changes.getIndicies()

O que mostrará que seu índice exclusivo não foi criado:
[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "name" : "_id_",
            "ns" : "test.changes"
    }
]

Se você começou de novo e só tinha um documento do original
{ "timestamp" : ISODate("2014-06-02T04:09:22.683Z") }

Em seguida, o exemplo de código acima cria o índice e produz um erro na segunda inserção:
{ __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) }

O índice foi criado corretamente desta 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
    }
]

Você precisará analisar seus dados para remover as duplicatas existentes ou apenas aceitar o uso do dropDups opção para removê-los automaticamente para você.

Consulte também o tutorial de documentação:Criar um índice exclusivo