web-dev-qa-db-ja.com

mongooseで一意の自動インクリメントフィールドを作成する

与えられたスキーマ:

var EventSchema = new Schema({
    id: {
        // ...
    },
    name: {
        type: String
    },
});

idを一意にし、自動インクリメントしたいです。 mongodb implementation を実現しようとしていますが、mongooseでそれを正しく行う方法を理解するのに問題があります。

私の質問はです:プラグインなどを使用せずにmongooseにautoincrementフィールドを実装する正しい方法は何ですか?

22
Glen Swift

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を実行する必要があります。

31
edtech

はい、その機能の「スキニー」です。

Mongoデータベースにそのコレクションが必要です。必要に応じて、同時キー割り当ての単一の真実の記録として機能します。 Mongoの例では、「アトミック」操作を実行して次のキーを取得し、同時リクエストがある場合でも、一意のキーが衝突なしで返されることを保証する方法を示します。

しかし、mongodbはそのメカニズムをネイティブに実装しておらず、その方法を示しています。 _idが一意のドキュメントキーとしてのみ使用されるようにします。これがあなたのアプローチを明確にすることを願っています。

アイデアを拡張するには、先に進み、mongoが提案する実装​​を定義済みのMongooseモデルに追加します。既に推測したとおり、Pre-saveまたはより優れたpre-initイベントでそれを使用して、 mongoに保存する前に収集サーバー側。

1
Biba

他の方法は、mongooseが提供する外部パッケージを使用できることです。

mongooseシーケンスプラグイン

mongoose auto incrementプラグイン

0
PALLAMOLLA SAI