首页 文章

在mongodb db中解析错误,插入具有唯一索引的集合

提问于
浏览
4

我在mongodb中有一个集合,其中包含以下形式的文档:

{
    "user": "user1",
    "email: "user1@example.com",
}

字段“user”和“email”是唯一的 . 我想在集合中插入新用户,同时检查两个值的唯一性 . 我可以在gogo中使用mgo进行插入,如下所示:

session.SetSafe(&mgo.Safe{}) // ensure mgo waits for errors

user := struct{
    string `bson:"user"`
    string `bson:"email"`
}{
    "user1",
    "user1@different.com"
}

err := users.Insert(user) // where user is type *mgo.Collection

如果我打印 err 它输出 insertDocument :: caused by :: 11000 E11000 duplicate key error index: kails.users.$name_1 dup key: { : "user1" }

是否有一种惯用的方法来使用此错误来查找哪些值不唯一?如果不是两者都有? (或者还需要其他步骤吗?) . 使用regexp解析字符串感觉......错了 .

如果无法使用错误查找是否不唯一,是否有“$或”查询(检查唯一)插入的替代方法?

我已经阅读了mgo documentation,希望我没有错过任何重要的内容 .

1 回答

  • 10

    http://godoc.org/labix.org/v2/mgo#IsDup

    func IsDup(错误错误)bool IsDup返回错误是否通知重复键错误,因为主键索引或辅助唯一索引已经具有给定值的条目 .

    例如

    err := users.Insert(user) // where user is type *mgo.Collection
    if err != nil {
        if mgo.IsDup(err) {
            // Is a duplicate key, but we don't know which one 
        }
        // Is another error
    }
    

    遗憾的是,在您可能拥有多个唯一索引的情况下,似乎没有办法辨别哪个值不唯一 .

    不过,您可以改为使用 IDEmail 而不是 useremail 的User结构 . 在Mongo插入时会自动生成ID,而Email将具有唯一索引 . 如果您不需要任何其他唯一索引,则可以安全地假设 IsDup == true 案例表示仅存在重复的电子邮件地址 .

    电子邮件地址是很好的用户名,因为用户记住的东西少了一些;)

相关问题