【MongoDB】【mongoose】 自增列实现

    科技2022-07-15  135

    原理: 设置一个counter集合,每一个文档对应需要自增的集合。每当一个集合添加文档时,获取对应counter的文档,增加值,并将新值设置为新增文档的id

    mongoose实现:

    Counter.ts

    import mongoose from 'mongoose'; /* 以items集合为例: counters集合里便会有一个文档: { _id:"itemId", seq_val:10 } _id表示该文档对应items集合。seq_val表示当前索引 */ type CounterDocument = mongoose.Document & { _id: string; seq_val: number; }; const CounerSchema = new mongoose.Schema({ _id: { type: String, required: true }, seq_val: { type: Number, default: 0 }, }); export const Counter = mongoose.model<CounterDocument>('Counter', CounerSchema);

    使用

    // 1. 添加到对应接口处 比较麻烦,所有新增group的接口都需要添加一次 function addGroup(){ ... let newGroupid=0 Counter.findOneAndUpdate({ _id: 'groupid' }, { $inc: { seq_val: 1 } }, (err, doc, res) => { if (err) console.log(err); newGroupid=doc.seq_val }); } //对应Schema添加钩子,save事件发生时,调用,只需在此设置即可 GroupSchema.pre('save',(next)=>{ let group = this //因为是group 的新增事件,查找对应文档,并通过$inc加一,并返回修改后的文档。 Counter.findOneAndUpdate({ _id: 'groupid' }, { $inc: { seq_val: 1 } }, (err, counter, res) => { if (err) console.log(err); console.log('counter:', counter); //返回后的文档的seq_val设置给当前实例。 group._id = counter.seq_val; next(); }); })
    Processed: 0.011, SQL: 8