2

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

4

1 回答 1

2

尝试创建一个唯一的稀疏索引

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

根据文档:

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

尽管这仅适用于没有该字段的文档,而不是具有该字段但该字段具有null值的文档。

于 2013-06-28T19:59:50.320 回答