私のプロジェクトでは、特定のモデルに対してslug
を実装していますが、ドキュメントのデータに基づいて一意に保ちたいと思います。マングース独自の自動インクリメントスラッグ
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' });
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')
フック上のDBを照会することができます
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」など)でドキュメントを再保存しようとするソリューションを探しています。 。
保存時にこのエラーを処理すると問題が発生する可能性があります。あなたはすでにpresaveハンドラから移動しました。別のコレクション 'users-slug'を作成してそこにスラッグを挿入しようとすることもできます(スラッグフィールドもそこにユニークでなければなりません)。あなたはあらかじめ保存しておくことができます。もしあなたがそこに失敗すれば、スラッグを変えてやり直すことができます。 –