我正在尝试在整个集合中保存一个具有唯一属性的文档。
因此,如果有人试图使用{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);
}
}));
}
答案 0 :(得分:1)
您的示例几乎按原样运行,但有一些拼写错误和范围问题。
第一次拨打kitten.save
时,您的回调参数为kitten
。问题是本地kitten
参数会影响外部kitten
,如果出现错误,则本地kitten
为undefined
。
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”等。
答案 1 :(得分: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.");
}
}));
});
找到名字和使用它之间可能存在竞争条件,但我认为我可以接受它。