MongoDB 自動インクリメント

MongoDB には SQL のような自動インクリメント機能はありません。MongoDB の _id はシステムが自動生成する12バイトの一意な識別子です。

しかし、特定の状況では、ObjectId の自動インクリメント機能を実装する必要があるかもしれません。

MongoDB はこの機能を実装していないため、プログラミングによって実装できます。以下では counters コレクションで _id フィールドの自動インクリメントを実装します。


counters コレクションを使用する

次の products ドキュメントを考えます。_id フィールドを 1,2,3,4 から n への自動インクリメント機能を実装したいとします。

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

このために、counters コレクションを作成すると、シーケンスのフィールド値を自動的に増やすことができます。

>db.createCollection("counters")

次に、counters コレクションに以下のドキュメントを挿入します。productid をキーとして使用します。

{
  "_id":"productid",
  "sequence_value": 0
}

sequence_value フィールドは、シーケンスが自動インクリメントされた後の値です。

以下のコマンドを使用して counters コレクションのシーケンスドキュメントに挿入します。

>db.counters.insert({_id:"productid",sequence_value:0})

JavaScript 関数を作成する

次に、関数 getNextSequenceValue を作成します。これはシーケンス名を入力として受け取り、指定されたシーケンスを自動的に 1 増やし、最新のシーケンス値を返します。この記事の例では、シーケンス名は productid です。

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify(
      {
         query:{_id: sequenceName },
         update: {$inc:{sequence_value:1}},
         "new":true
      });
   return sequenceDocument.sequence_value;
}

JavaScript 関数を使用する

次に、getNextSequenceValue 関数を使用して新しいドキュメントを作成し、ドキュメントの _id が自動的に返されたシーケンス値になるように設定します。

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"})

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"})

ご覧のとおり、getNextSequenceValue 関数を使用して _id フィールドを設定します。

関数が有効かどうかを検証するために、以下のコマンドでドキュメントを読み取ることができます。

>db.products.find()

上記のコマンドは以下の結果を返します。_id フィールドが自動インクリメントされていることがわかります。

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
その他の拡張