mongoose实现mongodb的自增字段

最近帮朋友弄一个小项目,数据库最初选定了mongodb,后来在需求文档中发现对玩家的id有自增的需求。这放在mysql中是天生支持的,可是在mongodb中为了分布式部署不出现id冲突,id是由机器名、时间等共同组成的。所以这个需求我们假设是mongodb单机部署,将来也不会分片的前提下才能按照本文的方法去做。

大致的思想是创建一个公共的counter集合,它记录其他集合的id数值,其他集合需要自增id前,先原子增加counter中对应的字段,然后用返回的增加后的值赋予自增id。用mongoose实现的话,可以hook住save之前的操作,让自增透明化,关键代码如下:

const CounterSchema = dbHelper.mongoose.Schema({
    _id: { type: String, required: true },
    seq: { type: Number, default: 0 }
});

const Counter = dbHelper.mongoose.model('counter', CounterSchema);

playerSchema.pre('save', function (next) {
    let doc = this;
    Counter.findByIdAndUpdate({ _id: 'playerId' }, { $inc: { seq: 1 } }, { new: true, upsert: true }, function (error, counter) {
        if (error)
            return next(error);
        doc.id = counter.seq;
        next();
    });
});

 

转载于:https://www.cnblogs.com/doublerain/p/8897830.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值