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" }
その他の拡張