E11000 erreur de clé en double index dans mongodb mangouste

ci-dessous est mon user schéma dans user.js modèle -

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
    },
    facebook: {
        id           : { type: String },
        token        : { type: String },
        email        : { type: String },
        name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

C'est comme ça que je l'utilise dans mon contrôleur -

var user = require('./../models/user.js');

C'est comme ça que je l'économise dans le db -

user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

Erreur -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"} 

j'ai vérifié la collection de db et aucune entrée en double n'existe, faites-moi savoir ce que je fais mal ?

pour information - req.body.email et req.body.password sont des valeurs de récupération.

j'ai aussi vérifié ce post mais pas d'aide STACK LINK

si j'ai enlevé complètement alors il insère le document, sinon il jette erreur" dupliquer " erreur même j'ai une entrée dans le local.e-mail

139
demandé sur Daksh Miglani 2014-06-26 16:12:30

17 réponses

le message d'erreur indique qu'il y a déjà un enregistrement avec null comme l'email. En d'autres mots, vous avez déjà un utilisateur sans adresse mail.

la documentation pertinente pour ceci:

si un document n'a pas de valeur pour le champ indexé dans un index unique, l'index stockera une valeur nulle pour ce document. En raison de la contrainte unique, MongoDB permettra seulement un document qui n'a pas la champ indexé. S'il y a plus d'un document sans valeur pour le champ indexé ou s'il manque le champ indexé, la construction de l'index échouera avec une erreur de clé dupliquée.

vous pouvez combiner la contrainte unique avec l'index clairsemé pour filtrer ces valeurs nulles de l'index unique et éviter l'erreur.

index uniques

les index épars contiennent seulement entrées pour les documents qui ont le champ indexé, même si le champ index contient une valeur nulle.

en d'autres termes, un index clairsemé est acceptable avec plusieurs documents ayant tous des valeurs null .

sparse " indices


des commentaires:

votre erreur dit que la clé s'appelle mydb.users.$email_1 ce qui me fait soupçonner que vous avez un index à la fois sur users.email et users.local.email (les premiers étant vieux et inutilisés à l'heure actuelle). Supprimer un champ d'un modèle Mongoose n'affecte pas la base de données. Vérifiez avec mydb.users.getIndexes() si tel est le cas et supprimez manuellement l'index indésirable avec mydb.users.dropIndex(<name>) .

148
répondu RikkusRukkus 2018-02-11 16:11:36

si vous êtes toujours dans votre environnement de développement, je laisserais tomber la base de données entière et je recommencerais avec votre nouveau schéma.

de la ligne de commande

➜ mongo
use dbName;
db.dropDatabase();
exit
41
répondu Rick 2015-09-13 14:56:12

vérifier les indices de collecte.

j'ai eu ce problème en raison d'index périmés dans la collection pour les champs, qui devraient être stockés par un nouveau chemin différent.

Mongoose ajoute l'index, quand vous spécifiez que le champ est unique.

14
répondu Yegor 2015-06-24 02:35:55

cela se produit lorsqu'il y a des index de schéma fréquents et des changements dans une base de données courante et cela peut être facilement corrigé en supprimant les index de système et la collection entière.

cela fonctionne après avoir fait cela, cela arrive aussi quand il n'y a pas de clé unique pour séparer deux documents l'un de l'autre.

si vous utilisez un shell, alors vous pouvez laisser tomber le db via -

db.users.drop();

j'Espère que cela a aidé :)

9
répondu Daksh Miglani 2017-03-22 15:45:31

C'est mon expérience relavant:

dans' User 'schema, j'ai placé' name ' comme clé unique et j'ai ensuite exécuté, ce qui je pense avait mis en place la structure de la base de données.

puis j'ai changé la clé unique comme 'nom d'utilisateur', et n'ai plus passé la valeur 'nom' quand j'ai sauvé des données à la base de données. Ainsi, le mongodb peut automatiquement définir la valeur' name ' de new record comme null qui est la clé duplicate. J'ai essayé le jeu' Nom 'clé comme pas unique clé {name: {unique: false, type: String}} dans "Utilisateur" ou " schéma afin de remplacer réglage d'origine. Cependant, il n'a pas de travail.

enfin, j'ai fait ma propre solution:

il suffit de définir une valeur de clé aléatoire qui ne sera probablement pas dupliquer la clé 'name' lorsque vous enregistrez votre enregistrement de données. Simplement la méthode mathématique '' + Math.random() + Math.random() fait une chaîne aléatoire.

4
répondu Kobe Luo 2015-05-21 09:38:36

j'ai fait face à des problèmes similaires , Je nettoie juste les index de domaines particuliers puis ses travaux pour moi . https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/

4
répondu mad Man 2016-11-07 14:23:33

je veux expliquer la réponse/solution à cela comme je l'explique à un enfant de 5 ans , pour que tout le monde puisse comprendre .

j'ai une application.Je veux que les gens s'inscrivent avec leur email,Mot de passe et numéro de téléphone . Dans ma base de données MongoDB, je veux identifier les gens uniquement sur la base de leurs numéros de téléphone et e - mail-ce qui signifie que le numéro de téléphone et l'e-mail doit être unique pour chaque personne.

cependant, il y a un problème : I ont réalisé que tout le monde a un phonenumber mais pas tout le monde a une adresse e-mail .

ceux qui n'ont pas d'adresse email m'ont promis qu'ils auront une adresse email d'ici la semaine prochaine. Mais je veux qu'ils soient enregistrés de toute façon - donc je leur dis de procéder à l'enregistrement de leurs numéros de téléphone en laissant le champ e-mail-input-vide .

ils le font .

ma base de données a besoin d'un champ d'adresse e - mail unique-mais j'ai beaucoup de personnes avec "null" comme adresse e-mail . Donc, je vais à mon code et dire à mon schéma de base de données d'autoriser vides/champs d'adresse courriel null que je remplirai plus tard avec des adresses e-mail uniques lorsque les gens qui ont promis d'ajouter leurs e-mails à leurs profils la semaine prochaine .

donc c'est maintenant un gagnant-gagnant pour tout le monde (sauf vous; -): le registre des personnes, je suis heureux d'avoir leurs données ...et ma base de données est heureux car il est utilisé bien ...mais vous en pensez quoi ? Je suis encore à donner vous le code qui fait le schéma .

voici le code : NOTE : la propriété clairsemée dans l'email , Est ce qui dit à ma base de données pour permettre des valeurs nulles qui seront remplies plus tard avec des valeurs uniques .

var userSchema = new mongoose.Schema({
  local: {
    name: { type: String },
    email : { type: String, require: true, index:true, unique:true,sparse:true},
    password: { type: String, require:true },
  },
  facebook: {
    id           : { type: String },
    token        : { type: String },
    email        : { type: String },
    name         : { type: String }
  }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

j'espère l'avoir bien expliqué . Heureux de NodeJS / codage de piratage!

3
répondu Daggie Blanqx 2018-08-18 10:24:28

j'ai eu un problème similaire et ce qui l'a résolu c'était de réaliser que mongo par défaut ne supporte qu'un seul schéma par collection. Soit stocker votre nouveau schéma dans une collection différente, soit supprimer les documents existants avec le schéma incompatible dans votre collection actuelle. Ou trouver une façon d'avoir plus d'un schéma par collecte.

2
répondu Embedded_Mugs 2016-08-10 19:25:22

c'est parce qu'il y a déjà une collection avec le même nom avec la configuration..Il suffit de retirer la collection de votre mongodb à travers Mongo shell et essayer à nouveau.

db.collectionName.supprimer ()

maintenant lancez votre application il devrait fonctionner

1
répondu Ignatius Andrew 2016-08-16 19:18:33

j'ai eu le même problème. J'ai essayé de déboguer de différentes façons. J'ai essayé de laisser tomber la collection et ça a bien marché après ça. Bien que ce ne soit pas une bonne solution si votre collection a beaucoup de documents. Mais si vous êtes dans le stade précoce de développement essayez de laisser tomber la collection.

db.users.drop();
1
répondu Sandip Subedi 2016-12-28 05:02:10

j'ai eu ce même problème quand j'ai eu la configuration suivante dans ma configuration/models.js

module.exports.models = {
  connection: 'mongodb',
  migrate: 'alter'
}

Changement de migrer à partir de 'modifier' à 'safe' fixe pour moi.

module.exports.models = {
  connection: 'mongodb',
  migrate: 'safe'
}
0
répondu Jam Risser 2016-10-02 17:15:48

même problème après avoir enlevé des propriétés d'un schéma après premier construction de quelques index sur l'épargne. enlever une propriété du schéma conduit à une valeur nulle pour une propriété non existante, qui a encore un index. laisser tomber l'index ou commencer avec une nouvelle collection à partir de zéro aide ici.

note: le message d'erreur vous conduira dans ce cas. il dispose d'un chemin d'accès, qui n'existe plus. im mon cas, l'ancien chemin d'accès a été ...$uuid_1 (c'est un index!), mais le nouveau est ....* priv.uuid_1

0
répondu chhtm 2016-10-06 13:29:41

j'ai eu le même problème quand j'ai essayé de modifier le schéma défini en utilisant mangoose. Je pense que le problème est dû à la raison qu'il y a un processus sous-jacent fait lors de la création d'une collection comme décrire les indices qui sont cachés de l'utilisateur(au moins dans mon cas).Donc la meilleure solution que j'ai trouvée était de laisser tomber toute la collection et de recommencer.

0
répondu Rahul P 2017-02-17 13:26:53

j'ai eu le même problème. Le problème est que j'ai supprimé un champ de modèle. Quand j'ai laissé tomber db il fixe

0
répondu user86168 2018-01-11 19:15:42

changer le nom de la collection s'il existe déjà dans la base de données, il affichera une erreur. Et si vous donnez n'importe quelle propriété comme unique la même erreur se produira.

-1
répondu arul mb 2018-08-04 08:00:48

avait le même problème que je l'ai résolu en supprimant l'attribut unique sur la propriété.

il suffit de trouver un autre moyen de valider ou de vérifier les valeurs des propriétés uniques de votre schéma.

-2
répondu davyCode 2018-02-03 00:57:22

veuillez effacer la collection ou supprimer toute la collection de la base de données MongoDB et réessayez plus tard.

-5
répondu Vittal Kamkar 2017-03-12 07:16:11