MongoDBでauto incrementを実装する

前提条件

  • Angular + Express + MongoDB + Node.jsの構成で作る

MongoDBにはオートインクリメントはない

MongoDBにはオートインクリメントの機能が用意されていない。
その代わりObjectIDというユニークな文字列のIDが用意されるので、基本的にはこっちを使えば良い。
そうは言っても、連番が欲しい時はあると思うので、独自実装してみる。

カウンターコレクションを作成する

Angular + Express.js + Mongo + Node.jsという構成

フォーマット

{
  key: string,
  seq: number
}
> db.counters.createIndex({ key: 1 }, { unique: true })
> db.counters.insertOne({ key:'user_id', seq: 1 })

modelの定義

import * as mongoose from 'mongoose';

export const counterModel: mongoose.Model<mongoose.Document> = mongoose.model(
  'counter',
  new mongoose.Schema({
    key: String,
    seq: Number
  })
);

実際に追加するコード

import { Request, Response, Router } from 'express'
import { counterModel } from '../../models/counter.model';
import { usersModel } from '../../models/users.model';

export const userSignUpRouter: Router = Router();

userSignUpRouter.post('/', (req: Request, res: Response) => {
  counterModel.findOneAndUpdate(
    {
      key: 'user_id'
    },
    {
      $inc: { seq: 1 }
    },
    {
      upsert: true
    },
    (error, doc: any) => {
      if (error) { throw error; }
      usersModel.insertMany(
        {
          id: doc.seq,
          name: req.body.name,
          email: req.body.email
        },
        (error, user) => {
          if (error) { res.json(error); }
          res.json(user)
        }
      )
    }
  )
});

これでユーザを新規登録するときに、user.idがAUTO INCREMENTされる。

参考

  • https://garafu.blogspot.com/2018/01/mongodb-collation-restriction.html