sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb unikt sparsamt index

Jag hade precis det här problemet också. Jag ville att ett värde antingen skulle vara null eller vara unikt. Så jag ställer in både unique och den sparse flaggor:

var UserSchema = new Schema({
  // ...
  email: {type: String, default: null, trim: true, unique: true, sparse: true},
  // ...
});

Och jag såg till att databasen faktiskt hade skapat indexet korrekt med db.users.getIndexes();

{
  "v" : 1,
  "key" : {
    "email" : 1
  },
  "unique" : true,
  "ns" : "test.users",
  "name" : "email_1",
  "sparse" : true,
  "background" : true,
  "safe" : null
},

(Det här är alltså inte samma som problemet här:mongo _id field duplicate key error )

Mitt misstag var att ställa in default värde till null . I någon mening räknar Mongoose en explicit null som ett värde som måste vara unikt. Om fältet aldrig är definierat (eller undefined ) så tvingas den inte vara unik.

email: {type: String, trim: true, unique: true, sparse: true},

Så om du också har det här problemet, se till att du inte ställer in standardvärden och se till att du inte ställer in värdena till null någon annanstans i din kod heller. Istället, om du behöver ställa in det explicit, ställ in det på undefined (eller ett unikt värde).




  1. Varför kan jag inte hitta en post av _id i mongodb

  2. Jämför inbäddat dokument med överordnat fält med mongoDB

  3. Hur kan jag använda MongoDB för att hitta alla dokument som har ett fält, oavsett värdet på det fältet?

  4. mongodb mongoTemplate får distinkt fält med några kriterier