【问题标题】:golang mongoDB unique indexes not working when more than one keygolang mongoDB唯一索引在多个键时不起作用
【发布时间】:2018-04-14 17:31:29
【问题描述】:

我想在注册时将数据插入用户集合。 因此,电子邮件和用户名是唯一的,不能重复。我使用 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

这仍然会成功插入,这也不是我想要的。

知道如何实现吗?

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

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

    您希望用户名和电子邮件都是唯一的单独,因此创建 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)

    【讨论】:

    • 感谢您的回复。它似乎工作。但是我不清楚如何做到这一点`你应该只连接并确保索引一次,`,我已经在启动时建立了一次连接,但不是索引。如果我没有误会,你的意思是我也需要把上面的代码放到init函数中?
    • 没关系。我想到了。感谢您的回答。我现在开始工作了。谢谢。
    猜你喜欢
    • 2012-06-25
    • 2023-03-07
    • 2013-11-13
    • 1970-01-01
    • 2019-01-28
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多