sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB/Mongoose unik begränsning på datumfält

Det verkar som att du redan hade dubbletter av värden innan du gjorde den här ändringen.

Här är ett testfall. Ha två dokument i din samling så här innan du distribuerar ett index:

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

Sedan med den grundläggande noteringen:

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

      });

    });

Du kommer att se att båda dokumenten har lagts till. Men saken här är att indexet inte distribuerades eftersom det orsakade ett fel som du inte såg. Du kan kontrollera detta i skalet.

db.changes.getIndicies()

Vilket visar att ditt unika index inte skapades:

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

Om du började om och bara hade ett dokument från originalet

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

Sedan skapar kodexemplet ovan indexet och ger ett fel i den andra infogningen:

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

Indexet skapades korrekt den här gången:

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

Du kommer att behöva gå igenom dina data för att ta bort befintliga dubbletter eller bara acceptera användningen av dropDups alternativet för att automatiskt ta bort dem åt dig.

Se även dokumentationshandledningen:Skapa ett unikt index




  1. Vilket är det mest tidseffektiva sättet att serialisera/deserialisera en DataTable till/från Redis?

  2. NodeJS och MongoDB applikationsautentisering av JWT

  3. Massuppdatering/upsert i MongoDB?

  4. Hur man sorterar med summan av 2 fält i MongoDB