MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB/Mongoose уникално ограничение за полето за дата

Изглежда, че вече сте имали дублирани стойности, преди да направите тази промяна.

Ето един тестов случай. Имайте два документа във вашата колекция като този, преди да разположите индекс:

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

След това с основния списък:

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

      });

    });

Ще видите, че и двата документа са добавени. Но работата тук е, че индексът не се внедри, защото това предизвика грешка, която не сте виждали. Можете да проверите това в обвивката.

db.changes.getIndicies()

Което ще покаже, че вашият уникален индекс не е създаден:

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

Ако сте започнали отново и сте имали само един документ от оригинала

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

Тогава примерният код по-горе създава индекса и генерира грешка във второто вмъкване:

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

Този път индексът е създаден правилно:

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

Ще трябва да прегледате данните си, за да премахнете съществуващите дубликати или просто да приемете използването на dropDups опция за автоматично премахване на тях вместо вас.

Вижте също урока за документация:Създаване на уникален индекс




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. елементи за актуализиране на mongoid в рамките на масива

  2. Актуализирайте множество елементи в масив в mongodb

  3. Текстово търсене в MongoDB И множество думи за търсене

  4. MongoDB извлича само съвпадащи поддокументи от документ с c#

  5. Причинено от:org.bson.BsonInvalidOperationException:Невалидно състояние INITIAL