Mongodb独特的稀疏指数

时间:2013-06-15 15:18:58

标签: mongodb indexing mongoose unique sparse-matrix

我在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 }

任何提示?

1 个答案:

答案 0 :(得分:16)

我也遇到过这个问题。我希望值为null或唯一。所以,我设置了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(或唯一值)。