2014-07-16 3 views
3

j'ai une collection en MongoDB avec des documents de la forme:Erreur d'analyse dans MongoDB db, insérez la collection avec index unique

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

Lorsque les champs "utilisateur" et "e-mail" sont uniques. Je souhaite insérer un nouvel utilisateur dans la collection, tout en vérifiant l'unicité des deux valeurs. Je peux faire un insert en golang avec mgo comme ceci:

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 

Si j'imprimer err il émet insertDocument :: caused by :: 11000 E11000 duplicate key error index: kails.users.$name_1 dup key: { : "user1" }

est-il un moyen idiomatiques d'utiliser cette erreur pour trouver des valeurs était pas unique? , sinon les deux? (ou y a-t-il d'autres étapes nécessaires?). L'analyse de la chaîne à l'aide d'une expression rationnelle est ... erronée.

S'il n'est pas possible d'utiliser l'erreur pour trouver si elle n'est pas unique, existe-t-il des alternatives à une requête "$ ou" (vérifiez pour unique) + insert?

J'ai lu le mgo documentation, j'espère que je n'ai rien manqué d'important.

+0

Comment avez-vous pu faire les champs unique? – Peres

+0

Où avez-vous mentionné votre champ unique 'Email id' – muthukumar

Répondre

9

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

func IsDup(err error) bool

IsDup renvoie si des informations err d'une double erreur clé, car un index de clé primaire ou un index unique secondaire a déjà une entrée avec la valeur donnée.

par exemple.

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 
} 

Malheureusement, il ne semble pas être un moyen de discerner qui valeur est unique dans le cas où vous pourriez avoir en place plusieurs index uniques.

Vous pourriez plutôt avoir un struct utilisateur avec ID et Email au lieu de user et email, cependant. ID serait généré automatiquement à l'insertion par Mongo, et Email aurait un index unique. Pourvu que vous n'ayez pas besoin d'autres index uniques, vous pouvez alors supposer qu'un cas IsDup == true signifie qu'il n'y a qu'une adresse e-mail en double.

adresses e-mail sont de bons noms d'utilisateur car il est une chose de moins pour les utilisateurs à ne pas oublier;)

+1

En fait, la variable "user" stocke le nom de l'écran, donc je dois le vérifier. Mais cela fera, je suppose que je vais faire un chèque 1er puis un insert. –

Questions connexes