English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MongoDBはSQLデータベースのようにカタログに自動増分機能が標準で用意されていません。デフォルトでは、_id
フィールドの12バイトObjectIdはドキュメントをユニークに識別するために主キーとして使用されます。しかし、特定の状況では、_idフィールドがObjectId以外の自動増分の値を持つことを望むことがあります。
これはMongoDBのデフォルト機能ではありませんので、以下の方法で実現します}}counters
MongoDBのドキュメントの推奨コレクションをプログラム的に実現します。
以下を参照してください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})
今、関数を作成します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; }
今、新しいドキュメントを作成し、返されるシーケンス値をドキュメントの_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"