MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Eindeutige MongoDB/Mongoose-Einschränkung für das Datumsfeld

Anscheinend hatten Sie bereits doppelte Werte, bevor Sie diese Änderung vorgenommen haben.

Hier ist ein Testfall. Halten Sie zwei Dokumente wie dieses in Ihrer Sammlung bereit, bevor Sie einen Index bereitstellen:

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

Dann mit dem Grundverzeichnis:

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

      });

    });

Sie werden sehen, dass beide Dokumente hinzugefügt wurden. Aber die Sache hier ist, dass der Index nicht bereitgestellt wurde, weil dies einen Fehler verursachte, den Sie nicht gesehen haben. Sie können dies in der Shell überprüfen.

db.changes.getIndicies()

Was zeigt, dass Ihr eindeutiger Index nicht erstellt wurde:

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

Wenn Sie neu angefangen haben und nur ein Dokument vom Original

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

Dann erstellt das obige Codebeispiel den Index und erzeugt einen Fehler in der zweiten Einfügung:

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

Der diesmal richtig erstellte Index:

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

Sie müssen Ihre Daten durchgehen, um die vorhandenen Duplikate zu entfernen, oder einfach die Verwendung des dropDups Option, sie automatisch für Sie zu entfernen.

Siehe auch das Dokumentations-Tutorial:Create A Unique Index