2013-06-28 8 views
2

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.

Répondre

1

Essayez de créer un unique sparse index:

db.users.ensureIndex({username:1},{unique:true,sparse:true}) 

Selon les docs:

Vous pouvez combiner l'option d'index clairsemés avec les index uniques options afin que mongod rejettera les documents qui ont des valeurs en double pour un champ , mais qui ignore les documents qui n'ont pas la clé.

Bien que cela ne fonctionne que pour les documents qui ne ont le terrain, par opposition aux documents qui ont le champ, mais où le champ a une valeur null.

+0

Parfait! Merci un million! –

+0

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

+0

@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

Questions connexes