sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB/Mongoose unik begrænsning på datofeltet

Det ser ud til, at du allerede havde dublerede værdier, før du foretog denne ændring.

Her er en testcase. Hav to dokumenter i din samling som dette, før du implementerer et indeks:

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

Så med den grundlæggende liste:

 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 dato =ny dato(); 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 vil se, at begge dokumenter er tilføjet. Men sagen her er, at indekset ikke blev implementeret, fordi det forårsagede en fejl, du ikke så. Du kan tjekke dette i skallen.

db.changes.getIndicies() 

Hvilket vil vise, at dit unikke indeks ikke blev oprettet:

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

Hvis du startede igen og kun havde ét dokument fra originalen

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

Derefter opretter kodeeksemplet ovenfor indekset og producerer en fejl i den anden indsættelse:

{ __v:0, tidsstempel:Mon 02. jun. 2014 14:29:44 GMT+1000 (EST), _id:538bfdb8961376867ae42e61 }/xxxxx/node_modules/mongoose/lib/utils; throw ersr:413. ^MongoError:insertDocument ::forårsaget af ::11000 E11000 duplicate key error index:test.changes.$timestamp_1 dup key:{ :new Date(1401683384647) } 

Indekset oprettet korrekt denne gang:

[ { "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 bliver nødt til at gennemgå dine data for at fjerne de eksisterende dubletter eller bare acceptere brugen af ​​dropDups mulighed for automatisk at fjerne dem for dig.

Se også dokumentationsvejledningen:Opret et unikt indeks




  1. Sådan rydder du konsol i MongoDB

  2. Hvorfor gridfs get virker ikke på fil-id (ObjectId) kun efter filnavn

  3. Håndtering af afsendelse af to parametre i et API-kald i Angular App

  4. Delvise kampe ved hjælp af mongos primitive pakke