2013-06-28 72 views
2

我想一个用户名字段添加到文档中的一个“用户”的收集,我想这是一个唯一索引。 (。到目前为止,我们已经使用的电子邮件地址进行登录,但我们想添加一个用户名字段为好)但是,在运行db.users.ensureIndex({用户名:1​​},{独特:真正})失败,因为mongo认为所有未设置的用户名都是重复的,因此不是唯一的。任何人都知道如何解决这个问题?添加字段是唯一索引到集合中的MongoDB

显示当前用户和用户名,如果他们有一个:

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

它不工作,因为这两个jamessammyusername: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的文件。

回答

1

尝试创建一个unique sparse index

db.users.ensureIndex({username:1},{unique:true,sparse:true}) 

按照文档:

您可以在稀疏索引选项与唯一索引选项 结合起来,这样的mongod会拒绝具有重复值的文档对于 场,但忽略不具备关键文件。

虽然这仅适用于不领域,而不是给有外地的文档文件,但是在该领域具有null值。

+0

太好了!太感谢了! –

+0

我需要重新检查这一点,但我认为该字段不存在,并为null是一个稀疏的索引相同,我不能完全记得虽然 – Sammaye

+0

@Sammaye我可能被误认为,我基于[这个答案](http ://stackoverflow.com/a/8608585/893780),虽然它很旧,而且事情可能已经改变:) – robertklep

相关问题