Mongodb唯一稀疏索引
我已经在我的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
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},