English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB自動増分シーケンス

MongoDBはSQLデータベースのようにカタログに自動増分機能が標準で用意されていません。デフォルトでは、_idフィールドの12バイトObjectIdはドキュメントをユニークに識別するために主キーとして使用されます。しかし、特定の状況では、_idフィールドがObjectId以外の自動増分の値を持つことを望むことがあります。

これはMongoDBのデフォルト機能ではありませんので、以下の方法で実現します}}countersMongoDBのドキュメントの推奨コレクションをプログラム的に実現します。

カウンターコレクションを使用して

以下を参照してくださいproductsドキュメント。_idフィールドは1,2,3,4からnまでの自増加整数シーケンスを作成します。

{
  "_id":1,
  "product_name": "アップル iPhone",
  "category": "mobiles"
}

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

>db.createCollection("counters")

今、以下のドキュメントproductidこれをキーとしてcountersコレクションに挿入します-

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

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関数を使用して

今、新しいドキュメントを作成し、返されるシーケンス値をドキュメントの_idフィールドに割り当てる際にgetNextSequenceValue関数を使用します。

以下のコードを使用して2つのサンプルドキュメントを挿入します-

>db.products.insert({
   "_id": getNextSequenceValue("productid"),
   "product_name":"アップル iPhone",
   "category": "mobiles"
)
>db.products.insert({
   "_id": getNextSequenceValue("productid"),
   "product_name": "Samsung S"3"
   "category": "mobiles"
)

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

機能の確認のために、findコマンドを使用してドキュメントを取得しましょう-

>db.products.find()

自動増分_idフィールドを持つ以下のドキュメントがクエリで返されました-

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