6

スキーマ (../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
        }
    })

エラー:

MongoError: E11000 duplicate key error index: bot.contacts.$name_1  dup key: { : null }

エラーメッセージを見た後、グーグルで検索したところ、ドキュメントが作成されると、名前が設定されていないため、null として扱われることがわかりました。Mongoose の Google グループ スレッドを参照してください 。最初に AM.notOwned が呼び出されたときは、コレクション内に名前キーのないドキュメントがないため、機能します。AM.notOwned は、ID フィールドと国フィールドを含むドキュメントを挿入します。

後続の AM.notOwned 呼び出しは、名前フィールドのないドキュメントが既に存在するため失敗し、name: null として扱われます。2 番目の AM.notOwned の呼び出しは、フィールド「name」が設定されておらず、同様に null として扱われるため失敗します。 ; したがって、一意ではありません。

そのため、Mongoose スレッドのアドバイスに従い、mongo のドキュメントを読んで、sparse: true を使用して調べました。ただし、それでも同じエラーがスローされます。さらに調べてみると、 thisと同じ問題かもしれないと思いましたが、スキーマを name: {type: String, index: {unique: true, sparse: true}} に設定しても修正されません。

This SO question/answer は、インデックスが正しくないことが原因である可能性があると信じさせますが、Mongo コンソールから db.collection.getIndexes() を読み取る方法がよくわかりません。

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

このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

7

sparse: true次回アプリを実行するときに Mongoose がインデックスを再作成できるように、シェル内の古い非スパース インデックスを削除する必要があります。

> db.contacts.dropIndex('name_1')
于 2013-02-22T17:03:33.353 に答える