最近帮朋友弄一个小项目,数据库最初选定了mongodb,后来在需求文档中发现对玩家的id有自增的需求。这放在mysql中是天生支持的,但是在mongodb中为了分布式部署不出现id冲突,id是由机器名、时间等共同组成的。因此这个需求咱们假设是mongodb单机部署,未来也不会分片的前提下才能按照本文的方法去作。mysql
大体的思想是建立一个公共的counter集合,它记录其余集合的id数值,其余集合须要自增id前,先原子增长counter中对应的字段,而后用返回的增长后的值赋予自增id。用mongoose实现的话,能够hook住save以前的操做,让自增透明化,关键代码以下:sql
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(); }); });