mongoDB,ID自增实现
counter.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const counterSchema = new Schema({
_id: { type: String, required: true },
sequence_value: { type: Number, default: 1 },
});
counterSchema.statics.getNextSequenceValue = async function (sequenceName) {
const sequenceDocument = await this.findOneAndUpdate(
{ _id: sequenceName },
{ $inc: { sequence_value: 1 } },
{ new: true, upsert: true }
);
return sequenceDocument.sequence_value;
};
module.exports = mongoose.model("Counter", counterSchema);
$inc 操作符用于自增计数器集合中的 sequence_value 属性
new 选项设置为 true,返回更新后的计数器文档
如果计数器文档不存在,则使用 upsert 选项创建一个新的文档。
然后,然后返回序列号
role.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Counter = require("./counter");
const RoleSchema = new Schema({
rid: {
type: Number,
unique: true, // 唯一索引,用于确保角色名称的唯一性
},
name: {
type: String,
required: true,
unique: true, // 唯一索引,用于确保角色名称的唯一性
},
description: {
type: String,
default: "",
},
});
RoleSchema.pre("save", async function (next) {
const role = this;
if (!role.isNew || role.rid) {
return next();
}
try {
if (!role.rid) {
role.rid = await Counter.getNextSequenceValue("rid"); // rid是你需要自增的属性
}
} catch (err) {
next(err);
}
});
module.exports = mongoose.model("Role", RoleSchema);
这里使用了 pre 钩子,即在保存 Role 实例之前执行的中间件。
实现效果
counter
role