最近幫朋友弄一個小項目,數據庫最初選定了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(); }); });