J'essaie d'ajouter un champ de nom d'utilisateur aux documents dans une collection 'users', et j'aimerais que ce soit un index unique. (Jusqu'à présent, nous utilisions des adresses e-mail pour la connexion, mais nous souhaitons également ajouter un champ de nom d'utilisateur.) Cependant, exécuter db.users.ensureIndex ({nom d'utilisateur: 1}, {unique: true}) échoue car mongo considère que tous les noms d'utilisateur non configurés sont des doublons et ne sont donc pas uniques. Quelqu'un sait comment contourner cela?Ajouter un champ unique index à la collection dans MongoDB
Afficher les utilisateurs actuels et nom d'utilisateur s'ils ont un:
> db.users.find({},{_id:0,display_name:1,username:1})
{ "display_name" : "james" }
{ "display_name" : "sammy", "username" : "sammy" }
{ "display_name" : "patrick" }
tentative de rendre le champ « nom d'utilisateur » un index unique:
> db.users.ensureIndex({username:1},{unique:true})
{
"err" : "E11000 duplicate key error index: blend-db1.users.$username_1 dup key: { : null }",
"code" : 11000,
"n" : 0,
"connectionId" : 272,
"ok" : 1
}
Il ne fonctionne pas parce que les deux james
et sammy
ont username:null
.
Fixons le nom d'utilisateur patrick
à 'patrick' pour éliminer la valeur null
en double.
> db.users.update({display_name: 'patrick'}, { $set: {username: 'patrick'}});
> db.users.ensureIndex({username:1},{unique:true})
> db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "blend-db1.users",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"username" : 1
},
"unique" : true,
"ns" : "blend-db1.users",
"name" : "username_1"
}
]
Maintenant ça marche!
Pour clarifier la question, ce que je voudrais être est en mesure de faire username
un index unique, sans avoir à se soucier de tous les documents qui ont username
encore mis à null
.
Parfait! Merci un million! –
Je dois revérifier cela mais je pense que le champ n'existe pas et être nul est le même dans un indice clairsemé, je ne peux pas totalement me souvenir de – Sammaye
@Sammaye Je pourrais me tromper, je me suis basé cette partie sur [cette réponse] (http : //stackoverflow.com/a/8608585/893780), bien que ce soit assez vieux et que les choses aient pu changer depuis :) – robertklep