我爲我的項目中的某些模型實施了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並重試。 –