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

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

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

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

次のことを考慮してください products資料。_idフィールドをauto-incremented integer sequence 1、2、3、4からnまで。

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

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

>db.createCollection("counters")

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

> 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関数の使用

ここで、関数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" }