与えられたスキーマ:
var EventSchema = new Schema({
id: {
// ...
},
name: {
type: String
},
});
id
を一意にし、自動インクリメントしたいです。 mongodb implementation を実現しようとしていますが、mongooseでそれを正しく行う方法を理解するのに問題があります。
私の質問はです:プラグインなどを使用せずにmongooseにautoincrementフィールドを実装する正しい方法は何ですか?
Mongooseを使用した自動インクリメントフィールドの実装の良い例を次に示します。
var CounterSchema = Schema({
_id: {type: String, required: true},
seq: { type: Number, default: 0 }
});
var counter = mongoose.model('counter', CounterSchema);
var entitySchema = mongoose.Schema({
testvalue: {type: String}
});
entitySchema.pre('save', function(next) {
var doc = this;
counter.findByIdAndUpdate({_id: 'entityId'}, {$inc: { seq: 1} }, function(error, counter) {
if(error)
return next(error);
doc.testvalue = counter.seq;
next();
});
});
最初に mongodb documentation からステップ1を実行する必要があります。
はい、その機能の「スキニー」です。
Mongoデータベースにそのコレクションが必要です。必要に応じて、同時キー割り当ての単一の真実の記録として機能します。 Mongoの例では、「アトミック」操作を実行して次のキーを取得し、同時リクエストがある場合でも、一意のキーが衝突なしで返されることを保証する方法を示します。
しかし、mongodbはそのメカニズムをネイティブに実装しておらず、その方法を示しています。 _idが一意のドキュメントキーとしてのみ使用されるようにします。これがあなたのアプローチを明確にすることを願っています。
アイデアを拡張するには、先に進み、mongoが提案する実装を定義済みのMongooseモデルに追加します。既に推測したとおり、Pre-saveまたはより優れたpre-initイベントでそれを使用して、 mongoに保存する前に収集サーバー側。