我正在尝试在整个集合中保存具有唯一属性的文档。

因此,如果有人尝试用{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);
        }
    }));
}

最佳答案

您的示例几乎可以按原样工作,但有一些错别字和范围界定问题。

第一次调用kitten.save时,回调的参数为kitten。问题在于,本地kitten参数隐藏了外部kitten,并且在发生错误的情况下,本地kittenundefined

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”等。

07-28 11:50