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
counter集合

role
role集合