Mongodb-autoincrement-sequence

提供:Dev Guides
移動先:案内検索

MongoDB-自動インクリメントシーケンス

MongoDBには、SQLデータベースのようなすぐに使用可能な自動インクリメント機能はありません。 デフォルトでは、ドキュメントを一意に識別するための主キーとして _id フィールドに12バイトのObjectIdを使用します。 ただし、_idフィールドに、ObjectId以外の自動インクリメント値を持たせたいシナリオがあるかもしれません。

これはMongoDBのデフォルトの機能ではないため、MongoDBのドキュメントで提案されている counters コレクションを使用して、プログラムでこの機能を実現します。

カウンターコレクションの使用

次の*製品*ドキュメントを検討してください。 _idフィールドは、1,2,3,4からnまでの auto-incremented integer sequence にする必要があります。

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

このために、すべてのシーケンスフィールドの最後のシーケンス値を追跡する counters コレクションを作成します。

>db.createCollection("counters")

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

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

フィールド sequence_value は、シーケンスの最後の値を追跡します。

次のコードを使用して、このシーケンスドキュメントをカウンタコレクションに挿入します-

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

JavaScript関数の作成

次に、入力としてシーケンス名を取得し、シーケンス番号を1増やして、更新されたシーケンス番号を返す関数 getNextSequenceValue を作成します。 この場合、シーケンス名は 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フィールドとして割り当てます。

次のコードを使用して2つのサンプル文書を挿入します-

>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フィールドの値を設定しました。

機能を確認するには、findコマンドを使用してドキュメントを取得します-

>db.products.find()

上記のクエリは、自動インクリメントされた_idフィールドを持つ次のドキュメントを返しました-

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