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?

questionAnswers(1)

yourAnswerToTheQuestion