Indice di errore chiave duplicato E11000 in mangusta mongodb

Di seguito è riportato il mio schema user nel modello user.js

 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; 

Questo è come lo sto usando nel mio controller –

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

Questo è come lo sto salvando nel 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"}); } }); 

Errore

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

Ho controllato la raccolta db e non esiste una voce duplicata, fammi sapere cosa sto facendo male?

FYI – req.body.email e req.body.password stanno recuperando i valori.

Ho anche controllato questo post ma nessun aiuto STACK LINK

Se ho rimosso completamente, inserisce il documento, altrimenti genera errore Errore “Duplicato” anche se ho una voce in local.email

Il messaggio di errore sta dicendo che c’è già un record con null come email. In altre parole, hai già un utente senza un indirizzo email.

La documentazione pertinente per questo:

Se un documento non ha un valore per il campo indicizzato in un indice univoco, l’indice memorizzerà un valore nullo per questo documento. A causa del vincolo univoco, MongoDB consentirà solo un documento che manca del campo indicizzato. Se c’è più di un documento senza un valore per il campo indicizzato o manca il campo indicizzato, la generazione dell’indice fallirà con un errore di chiave duplicato.

È ansible combinare il vincolo univoco con l’indice sparse per filtrare questi valori nulli dall’indice univoco ed evitare l’errore.

indici unici

Gli indici sparsi contengono solo voci per i documenti che hanno il campo indicizzato, anche se il campo indice contiene un valore nullo.

In altre parole, un indice sparse va bene con più documenti che hanno tutti valori null .

indici sparsi


Dai commenti:

Il tuo errore dice che la chiave si chiama mydb.users.$email_1 che mi fa sospettare che tu abbia un indice sia su users.email che users.local.email (il primo è vecchio e non usato al momento). La rimozione di un campo da un modello di Mangusta non influisce sul database. Verificare con mydb.users.getIndexes() se questo è il caso e rimuovere manualmente l’indice indesiderato con mydb.users.dropIndex() .

Se si è ancora nel proprio ambiente di sviluppo, farei cadere l’intero db e ricomincio con il nuovo schema.

Dalla riga di comando

 ➜ mongo use dbName; db.dropDatabase(); exit 

Controlla gli indici di raccolta.

Ho avuto questo problema a causa di indici obsoleti nella raccolta per i campi, che dovrebbero essere memorizzati da un nuovo percorso diverso.

Mongoose aggiunge l’indice, quando si specifica il campo come univoco.

Questo accade quando ci sono frequenti indici di schema e modifiche in un database corrente e questo può essere facilmente risolto eliminando gli indici di sistema e l’intera collezione.

Funziona dopo averlo fatto, questo succede anche quando non c’è una chiave univoca per separare due documenti l’uno dall’altro.

Se stai usando una shell, puoi eliminare il db tramite –

 db.users.drop(); 

Spero che questo abbia aiutato 🙂

Questa è la mia esperienza rilavante:

Nello schema “Utente”, ho impostato il “nome” come chiave univoca e poi ho eseguito un’esecuzione, che credo avesse configurato la struttura del database.

Poi ho cambiato la chiave univoca come “username”, e non ho più passato il valore “name” quando ho salvato i dati nel database. Quindi mongodb può automaticamente impostare il valore ‘nome’ del nuovo record come null, che è la chiave duplicata. Ho provato la chiave ‘name’ del set come chiave univoca {name: {unique: false, type: String}} nello schema ‘User’ per poter sovrascrivere l’impostazione originale. Tuttavia, non ha funzionato.

Alla fine, ho fatto la mia soluzione:

Basta impostare un valore chiave casuale che non sarà probabilmente duplicato al tasto ‘nome’ quando si salva il record di dati. Il metodo Simply Math '' + Math.random() + Math.random() crea una stringa casuale.

Ho affrontato problemi simili, ho appena cancellato gli indici di campi particolari e poi i suoi lavori per me. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/

Ho avuto un problema simile e quello che ha risolto è stato rendersi conto che mongo di default supporta solo uno schema per collezione. Memorizza il nuovo schema in una raccolta diversa o elimina i documenti esistenti con lo schema incompatibile all’interno della raccolta corrente. O trovare un modo per avere più di uno schema per collezione.

Voglio spiegare la risposta / soluzione a questo come sto spiegando a un bambino di 5 anni, quindi tutti possono capire.

Ho un’app. Voglio che le persone si registrino con la loro e-mail, password e numero di telefono. Nel mio database MongoDB, voglio identificare le persone in modo univoco in base ai loro numeri di telefono e alle e-mail, quindi questo significa che sia il numero di telefono che l’e-mail devono essere unici per ogni persona.

Tuttavia, c’è un problema: ho capito che tutti hanno un numero di telefono, ma non tutti hanno un indirizzo email.

Quelli che non hanno un indirizzo email mi hanno promesso che avranno un indirizzo email entro la prossima settimana. Ma li voglio comunque registrati – così dico loro di procedere registrando i loro numeri di telefono mentre lasciano il campo di input dell’email vuoto.

Lo fanno.

Il mio database ha bisogno di un campo di indirizzo email univoco – ma ho un sacco di persone con “null” come loro indirizzo email. Quindi vado al mio codice e dico allo schema del mio database di consentire campi di indirizzi email vuoti / nulli che in seguito inserirò con indirizzi univoci e-mail quando le persone che hanno promesso di aggiungere le loro e-mail ai loro profili la prossima settimana.

Quindi ora è un vantaggio per tutti (ma tu; -]): le persone si registrano, sono felice di avere i loro dati … e il mio database è felice perché viene usato bene … ma tu? Devo ancora darti il ​​codice che ha reso lo schema.

Ecco il codice: NOTA: la proprietà sparse nell’email è ciò che dice al mio database di consentire valori nulli che verranno successivamente riempiti con valori univoci.

 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; 

Questo perché c’è già una collezione con lo stesso nome con la configurazione .. Basta rimuovere la collezione dal tuo mongodb attraverso la shell mongo e riprovare.

db.collectionName.remove ()

ora esegui la tua applicazione dovrebbe funzionare

Ho avuto lo stesso problema. Provato il debug di modi diversi non poteva capire. Ho provato a far cadere la collezione e ha funzionato bene dopo. Anche se questa non è una buona soluzione se la tua collezione ha molti documenti. Ma se ti trovi nella fase iniziale dello sviluppo prova a eliminare la raccolta.

 db.users.drop(); 

Ho avuto lo stesso problema quando ho avuto la seguente configurazione nel mio config / models.js

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

Cambiare la migrazione da “alter” a “sicuro” l’ha risolto per me.

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

stesso problema dopo aver rimosso le proprietà da uno schema dopo aver prima creato alcuni indici sul salvataggio. la rimozione della proprietà dallo schema porta a un valore nullo per una proprietà non esistente, che aveva ancora un indice. indice di caduta o iniziare con una nuova raccolta da zero aiuta qui.

nota: il messaggio di errore ti guiderà in quel caso. ha un percorso, che non esiste più. Nel mio caso il vecchio percorso era … $ uuid_1 (questo è un indice!), ma il nuovo è …. * priv.uuid_1

Ho avuto lo stesso problema quando ho provato a modificare lo schema definito usando mangoose. Penso che il problema sia dovuto al fatto che ci sono alcuni processi sottostanti fatti quando si crea una collezione come la descrizione degli indici che sono nascosti all’utente (almeno nel mio caso). Quindi la soluzione migliore che ho trovato è stata quella di eliminare l’intera collezione e ricominciare.

Ho avuto lo stesso problema. Il problema era che ho rimosso un campo dal modello. Quando ho lasciato cadere db risolve

Ho avuto lo stesso problema che ho risolto rimuovendo l’attributo unique sulla proprietà.

Basta trovare un altro modo per convalidare o verificare valori di proprietà univoci per il proprio schema.

Cambia il nome della collezione se già esiste nel database, mostrerà un errore. E se hai dato una proprietà come unica, si verificherà lo stesso errore.

Cancella la raccolta o Elimina l’intera raccolta dal database MongoDB e riprova più tardi.