gpt4 book ai didi

mongodb - 将作为唯一索引的字段添加到 MongoDB 中的集合

转载 作者:可可西里 更新时间:2023-11-01 10:44:18 25 4
gpt4 key购买 nike

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

最佳答案

尝试创建一个 unique sparse index :

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

根据文档:

You can combine the sparse index option with the unique indexes option so that mongod will reject documents that have duplicate values for a field, but that ignore documents that do not have the key.

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

关于mongodb - 将作为唯一索引的字段添加到 MongoDB 中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com