Mongodb独特的稀疏指数

Mic*_*ina 9 indexing unique sparse-matrix mongoose mongodb

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

var Account = new Schema({
                email: { type: String, index: {unique: true, sparse: true} },
                        ....
Run Code Online (Sandbox Code Playgroud)

它已被正确创建:

{ "ns" : "MyDB.accounts", "key" : { "email" : 1 }, "name" : "email_1", "unique" : true, "sparse" : true, "background" : true, "safe" : null }
Run Code Online (Sandbox Code Playgroud)

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

{ [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 }
Run Code Online (Sandbox Code Playgroud)

任何提示?

小智 16

我也遇到过这个问题.我希望值为null或唯一.所以,我设置uniquesparse标志和标志:

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

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

{
  "v" : 1,
  "key" : {
    "email" : 1
  },
  "unique" : true,
  "ns" : "test.users",
  "name" : "email_1",
  "sparse" : true,
  "background" : true,
  "safe" : null
},
Run Code Online (Sandbox Code Playgroud)

(所以,这与此处的问题一样:mongo _id字段重复键错误)

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

email: {type: String, trim: true, unique: true, sparse: true},
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您要从字段需要唯一的状态转换到您不关心字段的状态,则“$unset”字段也同样有效。 (3认同)
  • 需要注意的是,您需要重新启动收集才能使其工作 (2认同)