ドキュメントでの作業 - Amazon DocumentDB

ドキュメントでの作業

ドキュメントデータベースとしての Amazon DocumentDB は、JSON データの保存、クエリ実行、インデックス作成を容易にします。Amazon DocumentDB において、コレクションはリレーショナルデータベースのテーブルに似ています。ただし、すべてのドキュメントに適用される単一のスキーマが存在しない点が異なります。コレクションでは、すべてのドキュメントを同じデータベースに保持しながら類似したドキュメントを一緒にグループ化でき、構造が類似している必要はありません。

前のセクションのドキュメント例を使用すると、reading_material および office_supplies のコレクションがあります。ソフトウェアは、ドキュメントが属するコレクションを適用する必要があります。

以下の例では、MongoDB API を使用して、ドキュメントを追加、クエリ、更新、および削除する方法を示します。

ドキュメントの追加

Amazon DocumentDB では、コレクションにドキュメントを最初に追加したときにデータベースが作成されます。次の例では、example という名前のコレクションを test データベースに作成しています。これは、クラスターに接続するときのデフォルトのデータベースです。最初のドキュメントの挿入時に接続が暗黙で作成されるため、コレクション名のエラーチェックはありません。したがって、コレクション名にタイプミス (example の代わりに eexample など) があると、正しいコレクションの代わりに eexample コレクションが作成され、このコレクションにドキュメントが追加されます。エラーチェックはアプリケーションで処理する必要があります。

次の例では、MongoDB API を使用してドキュメントを追加します。

単一のドキュメントの追加

単一のドキュメントをコレクションに追加するには、コレクションに追加したドキュメントで insertOne( {} ) オペレーションを使用します。

db.example.insertOne( { "Item": "Ruler", "Colors": ["Red","Green","Blue","Clear","Yellow"], "Inventory": { "OnHand": 47, "MinOnHand": 40 }, "UnitPrice": 0.89 } )

このオペレーションによる出力は、次のようになります(JSON 形式)。

{ "acknowledged" : true, "insertedId" : ObjectId("5bedafbcf65ff161707de24f") }

複数のドキュメントの追加

複数のドキュメントをコレクションに追加するには、コレクションに追加したドキュメントのリストで insertMany( [{},...,{}] ) オペレーションを使用します。この特定のリストのドキュメントのスキーマは異なりますが、すべてのドキュメントを同じコレクションに追加できます。

db.example.insertMany( [ { "Item": "Pen", "Colors": ["Red","Green","Blue","Black"], "Inventory": { "OnHand": 244, "MinOnHand": 72 } }, { "Item": "Poster Paint", "Colors": ["Red","Green","Blue","Black","White"], "Inventory": { "OnHand": 47, "MinOnHand": 50 } }, { "Item": "Spray Paint", "Colors": ["Black","Red","Green","Blue"], "Inventory": { "OnHand": 47, "MinOnHand": 50, "OrderQnty": 36 } } ] )

このオペレーションによる出力は、次のようになります(JSON 形式)。

{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bedb07941ca8d9198f5934c"), ObjectId("5bedb07941ca8d9198f5934d"), ObjectId("5bedb07941ca8d9198f5934e") ] }

ドキュメントのクエリ

ときどきオンラインストアのインベントリを検索し、販売商品を顧客が表示して購入できることを確認する必要があります。コレクションのクエリは、コレクションのすべてのドキュメントを対象とするか、特定の条件を満たすドキュメントのみを対象とするかにかかわらず、比較的簡単です。

ドキュメントのクエリを実行するには、find() オペレーションを使用します。この find() コマンドには、返すドキュメントを選択するために使用する条件を定義する単一のドキュメントパラメータがあります。find() からの出力は、改行のない 1 行のテキストとしてフォーマットされたドキュメントです。読みやすくするために出力ドキュメントをフォーマットするには、find().pretty() を使用します。このトピックのすべての例では、.pretty() を使用して出力を書式設定しています。

exampleinsertOne() の 2 つの演習で insertMany() コレクションに挿入した 4 つのドキュメントを使用してください。

コレクション内のすべてのドキュメントの取得

コレクション内のすべてのドキュメントを取得するには、find() オペレーションで、空のクエリドキュメントを指定します。

以下のクエリは、example コレクション内のすべてのドキュメントを返します。

db.example.find( {} ).pretty()

フィールドの値に一致するドキュメントの取得

フィールドおよび値に一致するすべてのドキュメントを取得するには、find() オペレーションで、一致するフィールドおよび値を識別するクエリドキュメントを指定します。

上記のドキュメントを使用して、このクエリは、「Item」フィールドが「Pen」に等しいすべてのドキュメントを返します。

db.example.find( { "Item": "Pen" } ).pretty()

埋め込みドキュメントに一致するドキュメントの取得

埋め込みドキュメントに一致するすべてのドキュメントを検索するには、find() オペレーションで、埋め込みドキュメントの名前と、その埋め込みドキュメントのすべてのフィールドおよび値を識別するクエリドキュメントを指定します。

埋め込みドキュメントに一致するには、そのドキュメントの埋め込みドキュメントの名前が、クエリで指定した名前と同じであることが必要です。さらに、埋め込みドキュメントのフィールドおよび値も、クエリで指定したものと同じであることが必要です。

次のクエリでは、「Poster Paint」ドキュメントのみ返ります。これは、「Pen」の値は「OnHand」や「MinOnHand」とは異なり、「Spray Paint」には、クエリドキュメントよりもフィールドが 1 つ (OrderQnty) 多いためです。

db.example.find({"Inventory": { "OnHand": 47, "MinOnHand": 50 } } ).pretty()

埋め込まれたドキュメントのフィールド値に一致するドキュメントの取得

埋め込みドキュメントに一致するすべてのドキュメントを検索するには、find() オペレーションで、埋め込みドキュメントの名前と、その埋め込みドキュメントのすべてのフィールドおよび値を識別するクエリドキュメントを指定します。

上記のドキュメントでは、以下のようにクエリで「ドット表記」を使用して埋め込みドキュメントと目的のフィールドを指定しています。埋め込みドキュメント内に他のフィールドがある場合でも、これらに一致するすべてのドキュメントが返されます。クエリは「Poster Paint」と「Spray Paint」を返します。それらはいずれも、指定したフィールドおよび値と一致するためです。

db.example.find({"Inventory.OnHand": 47, "Inventory.MinOnHand": 50 }).pretty()

配列に一致するドキュメントの取得

配列に一致するすべてのドキュメントを検索するには、find() オペレーションで、目的の配列名とその配列内のすべての値を指定します。クエリは、配列値の名前および順序がクエリで指定したものと一致するすべてのドキュメントを返します。

以下のクエリは「Pen」のみを返します。「Poster Paint」では追加の色 (White) があり、「Spray Paint」では色の順序が異なるためです。

db.example.find( { "Colors": ["Red","Green","Blue","Black"] } ).pretty()

配列値に一致するドキュメントの取得

特定の属性配列を含むすべてのドキュメントを見つけるには、find() オペレーションで、目的の配列名と値を指定します。

db.example.find( { "Colors": "Red" } ).pretty()

上記のオペレーションは、すべてのドキュメントを返します。3 つのドキュメントのそれぞれで、Colors という配列があり、その配列のどこかに「Red」という値があるためです。値として「White」を指定すると、クエリからは「Poster Paint」のみが返されます。

演算子を使用したドキュメントの取得

以下のクエリは、「Inventory.OnHand」値が 50 未満のすべてのドキュメントを返します。

db.example.find( { "Inventory.OnHand": { $lt: 50 } } )

サポートされているクエリ演算子のリストについては、「クエリおよびプロジェクション演算子」を参照してください。

ドキュメントの更新

通常、ドキュメントは静的ではなく、アプリケーションワークフローの一部として更新されます。以下の例では、ドキュメントを更新する方法のいくつかを示します。

既存のドキュメントを更新するには、update() オペレーションを使用します。update() オペレーションには 2 つのドキュメントパラメータがあります。最初のドキュメントでは、更新するドキュメントを識別しています。2 番目のドキュメントでは、行う更新を指定しています。

既存のフィールド ( シンプルなフィールド、配列、または埋め込みドキュメントは関係ありません) を更新する場合 フィールド名とその値を指定します。オペレーションの最後では、古いドキュメントのフィールドが新しいフィールドおよび値に置き換えられたようになります。

既存のフィールドの値の更新

先ほど追加した次の 4 つのドキュメントを以下の更新オペレーションに使用します。

{ "Item": "Ruler", "Colors": ["Red","Green","Blue","Clear","Yellow"], "Inventory": { "OnHand": 47, "MinOnHand": 40 }, "UnitPrice": 0.89 }, { "Item": "Pen", "Colors": ["Red","Green","Blue","Black"], "Inventory": { "OnHand": 244, "MinOnHand": 72 } }, { "Item": "Poster Paint", "Colors": ["Red","Green","Blue","Black","White"], "Inventory": { "OnHand": 47, "MinOnHand": 50 } }, { "Item": "Spray Paint", "Colors": ["Black","Red","Green","Blue"], "Inventory": { "OnHand": 47, "MinOnHand": 50, "OrderQnty": 36 } }
シンプルなフィールドを更新するには

シンプルなフィールドを更新するには、update()$set を使用してフィールド名と新しい値を指定します。以下の例では、Item を「Pen」から「Gel Pen」に変更します。

db.example.update( { "Item" : "Pen" }, { $set: { "Item": "Gel Pen" } } )

このオペレーションの結果は、次のようになります。

{ "Item": "Gel Pen", "Colors": ["Red","Green","Blue","Black"], "Inventory": { "OnHand": 244, "MinOnHand": 72 } }
配列を更新するには

以下の例では、既存の色の配列を、色のリストに Orange を含み White を含まない新しい配列に置き換えます。新しい色のリストは、update() オペレーションで指定された順序になります。

db.example.update( { "Item" : "Poster Paint" }, { $set: { "Colors": ["Red","Green","Blue","Orange","Black"] } } )

このオペレーションの結果は、次のようになります。

{ "Item": "Poster Paint", "Colors": ["Red","Green","Blue","Orange","Black"], "Inventory": { "OnHand": 47, "MinOnHand": 50 } }

新しいフィールドの追加

1 つ以上の新しいフィールドを追加してドキュメントを変更するには、挿入先のドキュメントと、$set 演算子を使用して挿入する新しいフィールドと値を識別するクエリドキュメントで、update() オペレーションを使用します。

以下の例では、値 3.99 を含むフィールド UnitPrice を Spray Paints ドキュメントに追加します。値 3.99 は数字であり、文字列ではありません。

db.example.update( { "Item": "Spray Paint" }, { $set: { "UnitPrice": 3.99 } } )

このオペレーションの結果は、次の (JSON フォーマット) のようになります。

{ "Item": "Spray Paint", "Colors": ["Black","Red","Green","Blue"], "Inventory": { "OnHand": 47, "MinOnHand": 50, "OrderQnty": 36 }, "UnitPrice": 3.99 }

埋め込みドキュメントの置き換え

埋め込みドキュメントを置き換えてドキュメントを変更するには、update() オペレーションで、埋め込みドキュメントと、$set 演算子を使用して挿入する新しいフィールドおよび値を識別するドキュメントを指定します。

以下のドキュメントがあるとします。

db.example.insert({ "DocName": "Document 1", "Date": { "Year": 1987, "Month": 4, "Day": 18 } })
埋め込みドキュメントを置き換えるには

以下の例では、現在の Date ドキュメントを、フィールド MonthDay のみを含み Year を含まない新しいドキュメントに置き換えます。

db.example.update( { "DocName" : "Document 1" }, { $set: { "Date": { "Month": 4, "Day": 18 } } } )

このオペレーションの結果は、次のようになります。

{ "DocName": "Document 1", "Date": { "Month": 4, "Day": 18 } }

埋め込みドキュメントへの新しいフィールドの挿入

埋め込みドキュメントにフィールドを追加するには

埋め込みドキュメントに 1 つ以上の新しいフィールドを追加してドキュメントを変更するには、update() オペレーションで、「ドット表記」を使用して、埋め込みドキュメントと、$set 演算子を使用して挿入する新しいフィールドおよび値を識別するドキュメントを指定します。

以下のドキュメントでは、コードに「ドット表記」を使用して Year フィールドと DoW フィールドを埋め込み Date ドキュメントに挿入し、Words フィールドを親ドキュメントに挿入しています。

{ "DocName": "Document 1", "Date": { "Month": 4, "Day": 18 } }
db.example.update( { "DocName" : "Document 1" }, { $set: { "Date.Year": 1987, "Date.DoW": "Saturday", "Words": 2482 } } )

このオペレーションの結果は、次のようになります。

{ "DocName": "Document 1", "Date": { "Month": 4, "Day": 18, "Year": 1987, "DoW": "Saturday" }, "Words": 2482 }

ドキュメントからのフィールドの削除

ドキュメントからフィールドを削除することでドキュメントを変更するには、update() オペレーションで、フィールドを削除するドキュメントを識別するクエリドキュメントを指定し、$unset 演算子で、削除するフィールドを指定します。

以下の例では、上記のドキュメントから Words フィールドを削除します。

db.example.update( { "DocName" : "Document 1" }, { $unset: { Words:1 } } )

このオペレーションの結果は、次のようになります。

{ "DocName": "Document 1", "Date": { "Month": 4, "Day": 18, "Year": 1987, "DoW": "Saturday" } }

複数のドキュメントからのフィールドの削除

複数のドキュメントからフィールドを削除してドキュメントを変更するには、update() オペレーションを使用します ($unset 演算子を指定し、multi オプションを true に設定します)。

次の例では、コレクション例のすべてのドキュメントから Inventory フィールドを削除します。ドキュメントに Inventory フィールドがない場合、そのドキュメントに対して実行されるアクションはありません。multi: true が省略された場合、アクションは条件を満たす最初のドキュメントでのみ実行されます。

db.example.update( {}, { $unset: { Inventory:1 } }, { multi: true } )

ドキュメントの削除

データベースからドキュメントを削除するには、remove() オペレーションを使用します。これにより、削除するドキュメントを指定します。以下のコードは example コレクションから「Gel Pen」を削除します。

db.example.remove( { "Item": "Gel Pen" } )

データベースからすべてのドキュメントを削除するには、以下のように remove() オペレーションで空のクエリを使用します。

db.example.remove( { } )