MongoDBチュートリアルに従って、 Auto-シーケンスフィールドのインクリメント
、最初に別のcounters
を作成する必要があります 使用された最後の数列を追跡するためのコレクション。 _id
フィールドにはシーケンス名、つまりuserID
が含まれます ユーザーコレクションのフィールドとseq
フィールドには、シーケンスの最後の値が含まれます。
まず、userID
の初期値をcountersコレクションに挿入します :
db.counter.insert(
{
"_id": "userID",
"seq": 0
}
)
カウンターコレクションにデータを入力したら、Mongooseでスキーマを生成します。
var counterSchema = mongoose.Schema({
"_id": { "type": String, "required": true },
"seq": { "type": Number, "default": 0 }
});
var counter = mongoose.model('counter', counterSchema);
次に、ユーザースキーマを再定義して、ユーザーモデルを保存するときに、最初にカウンターモデルのfindByIdAndUpdate()
を呼び出すようにします。 seq値をアトミックにインクリメントし、この新しい値を返すメソッド。これは、次のuserID
として使用できます。 値:
var userSchema = mongoose.Schema({
"userID": { "type": String, "required": true },
"firstname": { "type": String },
"lastname": { "type": String },
// other properties ...
}, { "collection": "user" }
);
userSchema.pre("save", function (next) {
var doc = this;
counter.findByIdAndUpdate(
{ "_id": "userID" },
{ "$inc": { "seq": 1 } }
, function(error, counter) {
if(error) return next(error);
doc.userID = counter.seq.toString();
next();
});
});