15

我在我的 mongodb 集合上创建了一个稀疏且唯一的索引。

var Account = new Schema({
                email: { type: String, index: {unique: true, sparse: true} },
                        ....

它已正确创建:

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null }

但是,如果我插入第二个未设置密钥的文档,则会收到此错误:

{ [MongoError: E11000 duplicate key error index: MyDB.accounts.$email_1  dup key: { : null }]
  name: 'MongoError',
  err: 'E11000 duplicate key error index: MyDB.accounts.$email_1  dup key: { : null }',
  code: 11000,
  n: 0,
  ok: 1 }

有什么提示吗?

4

1 回答 1

25

我也刚遇到这个问题。我希望一个值为空或唯一的值。所以,我设置了uniquesparse标志:

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

而且,我确保数据库实际上已经正确创建了索引db.users.getIndexes();

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

(所以,这这里的问题不同:mongo _id field duplicate key error

我的错误是将default值设置为null. 在某种意义上,Mongoose 将显式null视为必须唯一的值。如果该字段从未定义(或undefined),则不强制它是唯一的。

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

因此,如果您也遇到此问题,请确保您没有设置默认值,并确保您没有将这些值设置到null代码中的其他任何位置。相反,如果您需要显式设置它,请将其设置为undefined(或唯一值)。

于 2014-01-19T00:20:07.767 回答