我想在注册时将数据插入用户集合中。
因此,电子邮件和用户名是唯一的,不能重复。我使用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
}
问题是我希望用户名和电子邮件完全独特。这意味着,如果已将username
和email
插入到集合中,则无法再次插入。
但是现在,它只检查电子邮件和用户名,以确定它们是否都存在于同一文档中。这意味着如果有人提交相同的电子邮件但用户名不同,它仍然会通过插入过程。
例如: 如果我们已经在我们的收藏中有这个
{"username" : "user1", "email" : "aaa@xxx.com"}
如果其他用户提交:
{"username" : "user1", "email" : "aaa2@xxx.com"} //different email
这将成功插入。这不是我想要的。
或者,如果用户提交:
{"username" : "user2", "email" : "aaa@xxx.com"} //different username
这仍然会成功插入,这也不是我想要的。
任何想法如何实现它?
答案 0 :(得分:1)
带有密钥unique
的{{1}}索引可确保用户名 - 电子邮件对是唯一的。
您想要的是用户名和电子邮件都是唯一的单独,因此要创建2个唯一索引,一个使用["username", "email"]
,另一个使用username
密钥:
email
请注意,个别唯一的用户名和电子邮件也会隐式确保唯一的用户名 - 电子邮件对。
旁注:每次需要与MongoDB交互时,都不应连接和检查索引。相反,您应该只在启动时连接并确保索引一次。有关详细信息,请参阅以下问题:
mgo - query performance seems consistently slow (500-650ms)