我正在尝试将“用户名”字段添加到“用户”集合中的文档中,我希望它是一个唯一索引。 (到目前为止,我们一直在使用电子邮件地址进行登录,但我们也想添加一个用户名字段。)但是,运行db.users.ensureIndex({username:1},{unique:true})会失败,因为mongo认为所有未设置的用户名都是重复的,因此不是唯一的。有谁知道怎么解决这个问题?
显示当前用户和用户名(如果有):
> db.users.find({},{_id:0,display_name:1,username:1})
{ "display_name" : "james" }
{ "display_name" : "sammy", "username" : "sammy" }
{ "display_name" : "patrick" }
尝试将“用户名”字段设为唯一索引:
> db.users.ensureIndex({username:1},{unique:true})
{
"err" : "E11000 duplicate key error index: blend-db1.users.$username_1 dup key: { : null }",
"code" : 11000,
"n" : 0,
"connectionId" : 272,
"ok" : 1
}
它不起作用,因为james
和sammy
都有username:null
。
我们将patrick
的用户名设置为'patrick'以消除重复的null
值。
> db.users.update({display_name: 'patrick'}, { $set: {username: 'patrick'}});
> db.users.ensureIndex({username:1},{unique:true})
> db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "blend-db1.users",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"username" : 1
},
"unique" : true,
"ns" : "blend-db1.users",
"name" : "username_1"
}
]
现在有效!
为了澄清这个问题,我希望能够使username
成为唯一索引,而不必担心username
仍然设置为null
的所有文档
答案 0 :(得分:1)
尝试创建unique sparse index:
db.users.ensureIndex({username:1},{unique:true,sparse:true})
根据文档:
您可以将稀疏索引选项与唯一索引选项结合使用 这样mongod将拒绝具有重复值的文档 字段,但忽略没有密钥的文档。
虽然这仅适用于不具备字段的文档,而是包含字段的文档,但字段的值为null
。< / p>