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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值