MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB/Mongoose ograniczenie unikatowości w polu Data

Wygląda na to, że przed wprowadzeniem tej zmiany istniały już zduplikowane wartości.

Oto przypadek testowy. Przed wdrożeniem indeksu umieść w swojej kolekcji dwa takie dokumenty:

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

Następnie z podstawowym wykazem:

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

      });

    });

Zobaczysz, że oba dokumenty zostały dodane. Ale chodzi o to, że indeks nie został wdrożony, ponieważ spowodował to błąd, którego nie widziałeś. Możesz to sprawdzić w powłoce.

db.changes.getIndicies()

Który pokaże, że Twój unikalny indeks nie został utworzony:

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

Jeśli zacząłeś od nowa i masz tylko jeden dokument z oryginału

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

Następnie powyższy przykładowy kod tworzy indeks i generuje błąd w drugiej wstawce:

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

Indeks utworzony tym razem poprawnie:

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

Będziesz musiał przejrzeć swoje dane, aby usunąć istniejące duplikaty lub po prostu zaakceptować użycie dropDups opcja automatycznego usunięcia ich za Ciebie.

Zobacz także samouczek dokumentacji:Tworzenie unikalnego indeksu




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kompilacja sterownika MongoDB C++ na Cygwin

  2. W mongodb-go-driver, jak uporządkować/odwołać BSON do struktury

  3. Jak mogę wybrać liczbę rekordów na określone pole za pomocą mongodb?

  4. Mongoose, posortuj zapytanie według wypełnionego pola

  5. Jak korzystać z puli połączeń MongoDB w AWS Lambda?