2014-07-16 54 views
3

我有一个集合MongoDB中与形式的文件:MongoDB中数据库解析错误,插入到集合具有唯一索引

{ 
    "user": "user1", 
    "email: "[email protected]", 
} 

其中字段“用户”和“电子邮件”是唯一的。我想插入一个新用户到集合中,同时检查这两个值的唯一性。我可以与氧化镁golang这样做插入:

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

user := struct{ 
    string `bson:"user"` 
    string `bson:"email"` 
}{ 
    "user1", 
    "[email protected]" 
} 

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" }

是否有使用这个错误找到该值不是唯一的一个惯用的方式?如果不是两个? (还是需要其他步骤?)。使用正则表达式解析字符串会感觉...错误。

如果不可能使用错误来查找是否不唯一,那么是否有任何“$或”查询的替代方法(检查唯一)+ insert?

我读过mgo documentation,希望我没有错过任何重要的东西。

+0

您如何使这些字段具有唯一性? – Peres

+0

你在哪里提到你的唯一字段'电子邮件ID' – muthukumar

回答

9

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

func IsDup(err error) bool

IsDup返回是否重复的键错误ERR INFORMS因为主键索引或仲唯一索引已经与给定的值的条目。

例如,

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。 ID将在Mongo插入时自动生成,并且Email将具有唯一的索引。如果您不需要任何其他唯一索引,则可以安全地假设IsDup == true个案意味着只有重复的电子邮件地址。

电子邮件地址是很好的用户名,因为它是用户记住的一件事;)

+1

实际上,“用户”变量存储了屏幕名称,所以我确实需要检查它。但是那样做,我想我会先检查一下,然后再插入。 –

相关问题