node.js - duplicate - Usando sparse: true aún obteniendo MongoError: E11000 error de clave duplicada
e11000 duplicate key error collection (1)
Schema (../models/add.js)
var addSchema = new Schema({
name: {type: String, unique: true, sparse: true},
phone: Number,
email: String,
country: Number
});
module.exports = mongoose.model(''Contact'', addSchema);
add-manager.js
var Add = require(''../models/add.js'');
var AM = {};
var mongoose = require(''mongoose'');
module.exports = AM;
AM.notOwned = function(country, callback)
{
Add.update({country: country}, {country: country}, {upsert: true}, function(err, res){
if (err) callback (err);
else callback(null, res);
})
}
news.js
// if country # is not in the database
AM.notOwned(country, function(error, resp){
if (error) console.log("error: "+error);
else
{
// do stuff
}
})
error:
MongoError: E11000 duplicate key error index: bot.contacts.$name_1 dup key: { : null }
Después de ver el mensaje de error, busqué en Google y aprendí que cuando se crea el documento, dado que el nombre no está establecido, se trata como nulo. Consulte el subproceso del grupo Mongoose de Google. La primera vez que se llama a AM.notOwned funcionará, ya que no hay ningún documento en la colección sin una clave de nombre. AM.notOwned luego insertará un documento con un campo ID y un campo de país.
Las llamadas AM.notOwned subsiguientes fallan porque ya hay un documento sin campo de nombre, por lo que se trata como name: null, y se llama al segundo AM.notOwned, ya que el campo "name" no está establecido y también se trata como null. ; por lo tanto, no es único.
Entonces, siguiendo el consejo del hilo de Mongoose y leyendo los documentos de mongo que miré usando disperso: verdadero. Sin embargo, sigue arrojando el mismo error. Mirando más a fondo, pensé que podría ser el mismo problema que: esto , pero establecer el esquema para nombrarlo: {type: String, index: {unique: true, sparse: true}} tampoco lo arregla.
Esta pregunta / respuesta SO me lleva a pensar que podría deberse a que el índice no es correcto, pero no estoy muy seguro de cómo leer el archivo db.collection.getIndexes () de la consola de Mongo.
db.contacts.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "bot.contacts",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"name" : 1
},
"unique" : true,
"ns" : "bot.contacts",
"name" : "name_1",
"background" : true,
"safe" : null
}
]
¿Qué puedo hacer para resolver este error?
Debe soltar el índice viejo y no disperso en el intérprete de comandos para que Mongoose pueda recrearlo con sparse: true
la próxima vez que se ejecute su aplicación.
> db.contacts.dropIndex(''name_1'')