Używanie sparse: true nadal pobiera MongoError: błąd klucza powielonego E11000
Schemat (../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
}
})
błąd:
MongoError: E11000 duplicate key error index: bot.contacts.$name_1 dup key: { : null }
Po wyświetleniu komunikatu o błędzie przeszukałem go i nauczyłem się, kiedy dokument jest tworzony, ponieważ nazwa nie jest ustawiona, jest traktowana jako null.Zobacz temat Mongoose Google Group Thread Przy pierwszym wywołaniu AM.notOwned będzie działać, ponieważ w kolekcji nie ma żadnych dokumentów bez klucza nazw. AM.notOwned spowoduje wstawienie dokumentu z polem ID i polem kraju.
Kolejne wywołania AM.notOwned nie powiodły się, ponieważ istnieje już dokument bez pola nazwy, więc jest on traktowany jako nazwa: null, a drugi AM.notOwned jest wywoływany, ponieważ pole „nazwa” nie jest ustawione i jest traktowane również jako puste ; dlatego nie jest wyjątkowy.
Tak więc postępując zgodnie z radą wątku Mongoose i czytającmongo docs Patrzyłem na użycie sparse: true. Jednak nadal rzuca ten sam błąd. Patrząc dalej, pomyślałem, że może to być ten sam problem, co:to, ale ustawiając schemat na name: {type: String, index: {unique: true, sparse: true}} też tego nie naprawia.
To WIĘC. pytanie / odpowiedź prowadzi mnie do przekonania, że może to być spowodowane tym, że indeks nie jest poprawny, ale nie jestem pewien, jak odczytać db.collection.getIndexes () z konsoli 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
}
]
Co mogę zrobić, aby rozwiązać ten błąd?