我在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,希望我没有错过任何重要内容。
答案 0 :(得分:10)
http://godoc.org/labix.org/v2/mgo#IsDup
func IsDup(err error) bool
IsDup返回错误是否通知重复键错误,因为主键索引或辅助唯一索引已经具有给定值的条目。
e.g。
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
}
不幸的是,在您可能有多个唯一索引的情况下,似乎没有办法辨别哪个值不唯一。
但是,您可以改为使用ID
和Email
而不是user
和email
的用户结构。在Mongo插入时会自动生成ID,而Email将具有唯一索引。如果您不需要任何其他唯一索引,则可以安全地认为IsDup == true
案例意味着只有重复的电子邮件地址。
电子邮件地址是良好的用户名,因为用户记住的东西少一点;)