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 フィールドは不変であり、更新することはできません。