gpt4 book ai didi

mongodb - golang mongoDB 唯一索引在多个键时不起作用

转载 作者:IT王子 更新时间:2023-10-29 01:44:21 26 4
gpt4 key购买 nike

我想在注册时将数据插入用户集合。因此,电子邮件和用户名是唯一的,不能重复。我使用 mgo.v2 作为 mongodb 驱动程序,使用 mgo.Index 来定义唯一键。

这是我做的:

type User struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"_id,omitempty"`
Username string `bson:"username" json:"username"`
PW string `bson:"pw" json:"pw"`
Email string `bson:"email" json:"email"`
}


func (u *User) Add() error {
mConn := mongodb.Conn()
defer mConn.Close()
index := mgo.Index{
Key: []string{"username", "email"},
Unique: true,
}
c := mConn.DB(DB).C(Collection)

err := c.EnsureIndex(index)
if err != nil {
return err
}
u.CreatedAt = time.Now()

err = c.Insert(u)

return err
}

问题是我希望用户名和电子邮件完全唯一。这意味着,如果 usernameemail 已经插入到集合中,它们将无法再次插入。

但是现在,它只同时检查电子邮件和用户名以确定它们是否存在于同一个文档中。这意味着如果有人提交相同的电子邮件但用户名不同,它仍然会通过插入过程。

例如:如果我们的收藏中已经有了这个

{"username" : "user1", "email" : "aaa@xxx.com"}

如果另一个用户提交:

{"username" : "user1", "email" : "aaa2@xxx.com"} //different email

这将成功插入。这不是我想要的。

或者,如果用户提交:

{"username" : "user2", "email" : "aaa@xxx.com"} //different username

这样还是会成功插入,这也不是我想要的。

知道如何实现吗?

最佳答案

带有键 ["username", "email"]unique 索引确保用户名-电子邮件是唯一的。 p>

您希望用户名和电子邮件都单独是唯一的,因此创建 2 个唯一索引,一个使用 username,一个使用 email键:

for _, key := range []string{"username", "email"} {
index := mgo.Index{
Key: []string{key},
Unique: true,
}
if err := c.EnsureIndex(index); err != nil {
return err
}
}

请注意,单独唯一的用户名和电子邮件也隐含地确保唯一的用户名-电子邮件对。

附带说明:您不应该在每次需要与 MongoDB 交互时连接和检查索引。相反,您应该只在启动时连接并确保索引一次。有关详细信息,请参阅这些问题:

mgo - query performance seems consistently slow (500-650ms)

too many open files in mgo go server

Concurrency in gopkg.in/mgo.v2 (Mongo, Go)

关于mongodb - golang mongoDB 唯一索引在多个键时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834250/

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