1

コレクション全体で一意のプロパティを持つドキュメントを保存しようとしています。

したがって、誰かが {name: 'kitty'} で子猫を保存しようとして、その名前が既に存在する場合、その名前は失敗し、{name: 'kitty1'} (次に 'kitty2' など) で再試行します。

これを行う良い方法が本当にわかりません。アイデアはありますか?

これが私がこれまでに持っているものです(動作しません)。

var kittenSchema = new Schema ({
    name: {type: String, index: {unique: true}}
})

var Kitten = mongoose.model('Kitten', kittenSchema);

var kitten = new Kitten({
    name: 'kitty'
});

kitten.save(function(err, kitten){
    if (err){
        saveKitten(kitten, 1, function(err, kitten){
            if (err){
                console.log("Damn, no kitten");
            } else {
                console.log("New kitten " + kitten.name + "saved.");
            });
    } else {
        console.log("New kitten " + kitten.name + "saved.");
    }
}));

function saveKitten(kitten, count, callback){
    kitten.name = kitten.name + count;

    kitten.save(function(err, newKitten){
        if (err){
            if (count > 100){
                // Give up!
                callback(err, null);
            }

            saveKitten(kitten, count + 1, callback);
        } else {
            callback(null, newKitten);
        }
    }));
}
4

2 に答える 2

1

あなたの例はほとんどそのまま機能しますが、いくつかのタイプミスとスコープの問題があります。

を初めて呼び出すkitten.saveとき、コールバックの引数はkittenです。問題は、 localkitten引数が externalkittenを隠し、エラーが発生した場合、 localkittenundefined.

var kittenSchema = new mongoose.Schema ({
    name: {type: String, index: {unique: true}}
})

var Kitten = mongoose.model('Kitten', kittenSchema);

var kitten = new Kitten({
    name: 'kitty'
});

kitten.save(function(err, newKitten){
    if (err){
        saveKitten(kitten, 1, function(err, newKitten){
            if (err){
                console.log("Damn, no kitten");
            } else {
                console.log("New kitten " + newKitten.name + " saved.");
            }
        });
    } else {
        console.log("New kitten " + newKitten.name + " saved.");
    }
});

function saveKitten(kitten, count, callback){
    kitten.name = kitten.name + count;

    kitten.save(function(err, newKitten){
        if (err){
            if (count > 100){
                // Give up!
                callback(err, null);
            }

            saveKitten(kitten, count + 1, callback);
        } else {
            callback(null, newKitten);
        }
    });
}

また、ここで「+」を使用している方法は、このコードが「kitten」、「kitten1」、「kitten12」、「kitten123」などを挿入することを意味することに注意してください。

于 2013-03-28T17:25:21.500 に答える
0

NilsH からの指摘を受けて、可能性のある名前の競合をすべて引き戻し、ローカルで新しい名前を探すことを試みるかもしれないと思います。

このようなもの:

var Kitten = mongoose.model('Kitten', kittenSchema);

var kitten = new Kitten({
    name: 'kitty'
});

Kitten.find({name: new RegExp('^'+ kitten.name +'*', "i")}, 'name').exec(function(err, docs){
    var tryName = name;
    var count = 0;

    while (True){
        if (_.indexOf(docs, tryName) != -1){
            break;
        } else {
            tryName = name + count;
        }
    }

    kitten.name = tryName;

    kitten.save(function(err, kitten){
        if (err){
            console.log("Damn, no kitten");
        } else {
            console.log("New kitten " + kitten.name + "saved.");
        }
    }));    
});

名前を見つけてから使用するまでの間に競合状態が発生する可能性がありますが、私はそれを受け入れることができると思います.

于 2013-03-28T18:26:06.307 に答える