Mongoid/MongoDBでauto increment

Auto Increment with MongoDBより、Mongoid/MongoDBでMySQLのauto incrementみたいなことをする方法。

連番を保持するためのCollectionを用意して、新しくDocumentを作る際にそれをfind_and_modifyで1増加させるという方法をとる。 find_and_modifyを使うので、MongoDBは1.3.0以上、Mongoidは2.2.0以上が必要になる。

まずは連番を保持するためのCollectionを用意する。

class Seq
  include Mongoid::Document
  field :collection, type: String
  field :seq,        type: Integer
end

auto increment的なことがしたいCollectionではbefore_validateのタイミングでSeqから採番する。

class User
  include Mongoid::Document
  field :name,  type: String
  field :seq,   type: Integer, default: 0

  before_create :set_seq

  private

  def set_seq
    self.seq = Seq.collection.find_and_modify(
      query:  { "collection" => "users" },
      update: { "$inc" => { "seq" => 1 } },
      new:    true
    )["seq"]
  end
end

連番Collection別に連番を保持するためのDocumentは事前に用意しておく必要があるので忘れずに。

Seq.create(collection: "users", seq: 0)