添加MongoDB中集合的唯一索引字段

时间:2013-06-28 19:53:55

标签: mongodb mongoose

我正在尝试将“用户名”字段添加到“用户”集合中的文档中,我希望它是一个唯一索引。 (到目前为止,我们一直在使用电子邮件地址进行登录,但我们也想添加一个用户名字段。)但是,运行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
    }

它不起作用,因为jamessammy都有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的所有文档

1 个答案:

答案 0 :(得分:1)

尝试创建unique sparse index

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

根据文档:

  

您可以将稀疏索引选项与唯一索引选项结合使用   这样mongod将拒绝具有重复值的文档   字段,但忽略没有密钥的文档。

虽然这仅适用于不具备字段的文档,而是包含字段的文档,但字段的值为null。< / p>