Mongodb唯一稀疏索引

Mongodb唯一稀疏索引,mongodb,indexing,mongoose,unique,sparse-matrix,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", "uniqu

我已经在我的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 }

有什么提示吗?

我也有这个问题。我希望值为null或唯一。因此,我设置了
unique
sparse
标志:

var UserSchema = new Schema({
  // ...
  email: {type: String, default: null, trim: true, unique: true, sparse: true},
  // ...
});
并且,我确保数据库已经使用
db.users.getIndexes()正确地创建了索引

(因此,这与这里的问题不同:)

我的错误是将
default
值设置为
null
。在某种意义上,Mongoose将显式
null
计算为必须唯一的值。如果该字段从未定义过(或
未定义
),则不会强制要求其唯一

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

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

如果存在电子邮件字段为“null”的文档,是否可以签入集合。您正在使用的模板引擎可能正在为该字段插入空值。我在本地检查,它工作正常。通过将
电子邮件
设置为
唯一
,要求集合中的每个文档都是唯一的。例如,只有一个
null
值。所以,这听起来像是在按预期工作。刚刚回答了这个问题:--这是非常相似的(很可能是相同的)问题。@Abhishek Kumar我用的是猫鼬。显然,它似乎没有创建电子邮件字段,因为它不在文档中。但是,如果我使用命令
db.collection.find({email:null})
搜索,我会找到一个对象!!真奇怪!有什么提示吗?@MicheleSpina:使用mongosniff检查mongod的查询是什么,并查看查询是否包含空电子邮件字段。我肯定会有一些新的文件插入空电子邮件字段。在此之后,您可以轻松调试发送这些查询的用户。
$unset
如果您正在从字段需要唯一的状态过渡到不关心字段的状态,则设置字段也可以。需要注意的是,您需要重新启动集合以使其正常工作
email: {type: String, trim: true, unique: true, sparse: true},