Mit sparse: true wird immer noch der Fehler "MongoError: E11000 duplicate key" angezeigt

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 }

Nachdem ich die Fehlermeldung gesehen hatte, googelte ich herum und stellte fest, dass das Dokument beim Erstellen als null behandelt wird, da der Name nicht festgelegt ist.Siehe Mungo-Google-Gruppen-Thread Der erste Aufruf von AM.notOwned funktioniert, da die Sammlung keine Dokumente ohne Namensschlüssel enthält. AM.notOwned fügt dann ein Dokument mit einem ID-Feld und einem Länderfeld ein.

Nachfolgende AM.notOwned-Aufrufe schlagen fehl, da es bereits ein Dokument ohne Namensfeld gibt. Daher wird es als name: null behandelt, und der zweite AM.notOwned-Aufruf schlägt fehl, da das Feld "name" nicht festgelegt und ebenfalls als null behandelt wird ; daher ist es nicht eindeutig.

Befolgen Sie also den Rat des Mungofadens und lesen Sie diemongo docs Ich sah mit spärlicher: wahr. Es wird jedoch immer noch derselbe Fehler ausgegeben. Bei näherer Betrachtung dachte ich, es könnte dasselbe Problem sein wie:dieseDas Setzen des Schemas auf name: {type: String, index: {unique: true, sparse: true}} behebt das Problem ebenfalls nicht.

Diese SO. frage / antwort lässt mich glauben, dass es daran liegen könnte, dass der index nicht korrekt ist, aber ich bin mir nicht ganz sicher, wie ich die db.collection.getIndexes () von der mongo-konsole lesen soll.

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
    }
]

Was kann ich tun, um diesen Fehler zu beheben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage