我为我的项目中的某些模型实施了slug
,我想保持它的唯一性和基于文档的数据。猫鼬独特的自动增量slug
var user = new User({ name: { first: 'John', last: 'Doe' });
user.save().then(function(user) {}); // user.slug === 'john-doe'
var user2 = new User({ name: { first: 'John', last: 'Doe' });
user2.save().then(function(user) {}); // user.slug === 'john-doe-2'
我可以成功地实现它,我甚至可以查询数据库上.pre('save')
钩,就像这样:
UserSchema.pre('save', function(next) {
var user = this;
return User.distinct('slug')
.exec()
.then(function(slugs) {
// generate a unique slug like "john-doe-2",
// checking it against slugs that are already
// in the database, and set it to user
next();
});
});
唯一的问题是并发请求(可能性不大,但仍可能):
var user = new User({ name: { first: 'John', last: 'Doe' }),
user2 = new User({ name: { first: 'John', last: 'Doe' });
Promise.all([ user.save(), user2.save() ]);
// throws validation error if slug should be unique
为此,我正在寻找一个解决方案来处理验证错误(唯一索引重复),并尝试用更新的参数(如“john-doe-2”)重新保存文档。 。
在保存中处理此错误可能会产生问题。您已经离开预处理程序。你可以创建另一个集合'users-slug'并尝试将slug插入到那里(slug字段也应该是唯一的)。你可以在预存储中完成。如果你在那里失败了,你可以改变slu and并重试。 –