MongoDBドキュメントデータの更新 - mongoシェルを使用する
この章では、mongoシェルを通じてMongoDBドキュメントデータを更新する方法について紹介します。MongoDBは、様々な種類の演算子によって実装された異なる更新方法をサポートしており、複数の更新関数もサポートしています。
テストデータの準備
inventoryコレクションにテストデータのバッチを挿入します。
db.inventory.insertMany( [
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );
更新演算子の構文
MongoDBは、複数の更新演算子(例:$set)を提供しています。これらを使用してフィールドの値を変更できます。
更新演算子パラメータのフォーマットは次のようになります:
{
<update operator>: { <field1>: <value1>, ... },
<update operator>: { <field2>: <value2>, ... },
...
}
説明:
-
: 更新演算子 -
: フィールド名 -
: フィールドのパラメータ
$set演算子
この演算子は、ドキュメントを更新し、フィールドが存在しない場合は新しいフィールドを作成します。
単一のドキュメントの更新
db.collection.updateOne()メソッドを使用してドキュメントを更新します。
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
更新の説明:
- まず、クエリ条件(item = paper)を使用して最初のドキュメントを取得します。
- $set演算子を使用して、size.uomフィールドの値をcmに更新し、statusフィールドの値をPに更新します。
- $currentDate演算子を使用して、lastModifiedフィールドの値を現在の日付に更新します。lastModifiedフィールドが存在しない場合、$currentDateはフィールドを作成します。
複数のドキュメントの更新
条件を満たす複数のドキュメントを更新するには、db.collection.updateMany()メソッドを使用します。
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
更新の説明:
- まず、クエリ条件(qty < 50)を使用してすべてのドキュメントを取得します。
- $set演算子を使用して、size.uomフィールドの値をinに更新し、statusフィールドの値をPに更新します。
- $currentDate演算子を使用して、lastModifiedフィールドの値を現在の日付に更新します。lastModifiedフィールドが存在しない場合、$currentDateはフィールドを作成します。
ヒント: $lt演算子は未満の意味を表します。
ドキュメントの置換
db.collection.replaceOne() メソッドを使用して、ドキュメントの内容を置換します(_id フィールドを除く)。置換するドキュメントには、元のドキュメントとは異なるフィールドを持たせることができます。_id フィールドは不変であるため、省略することができます。ただし、_id フィールドを含める場合は、更新されるドキュメントの id 値と一致している必要があります。
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
説明:
- まず、クエリ条件(item=paper)を使用して、最初のドキュメントを取得します。
- replaceOne メソッドの第二パラメータの内容で、一致したドキュメントを置換します。
更新動作
原子性
MongoDB におけるすべての書き込み操作は、個々のドキュメントレベルで原子的です。
_id フィールド
_id フィールドは不変であり、更新することはできません。