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

猜你喜欢

转载自blog.csdn.net/m0_46262108/article/details/129115063