MongoDB レコードの更新

MongoDBMongoDBBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、単一ドキュメントの更新、バルク更新の実行、更新演算子の利用など、さまざまな手法を使ってMongoDBのレコードを更新する方法を学びます。また、更新結果の処理方法や更新されたデータの検証方法についても探求します。この実験ではMongoDBの基本的なCRUD(作成、読み取り、更新、削除)操作を扱い、MongoDBデータベース内のデータを効果的に管理するための必要なスキルを習得します。

実験では、まずupdateOne()メソッドを使って単一ドキュメントを更新する方法を示し、次にupdateMany()メソッドを使ったバルク更新を探求します。その後、$setなどの更新演算子を使ってドキュメント内の特定のフィールドを変更する方法について学びます。また、更新結果の処理方法や更新されたデータの検証方法を学び、MongoDBレコードの整合性を確保します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ErrorHandlingGroup(["Error Handling"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/BasicOperationsGroup -.-> mongodb/bulk_update_documents("Bulk Update Documents") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/DataTypesGroup -.-> mongodb/manage_array_elements("Manage Array Elements") mongodb/ErrorHandlingGroup -.-> mongodb/handle_write_errors("Handle Write Errors") subgraph Lab Skills mongodb/insert_document -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/update_document -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/bulk_update_documents -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/find_documents -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/query_with_conditions -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/manage_array_elements -.-> lab-420823{{"MongoDB レコードの更新"}} mongodb/handle_write_errors -.-> lab-420823{{"MongoDB レコードの更新"}} end

単一ドキュメントの更新

このステップでは、updateOne()メソッドを使ってMongoDB内の単一ドキュメントを更新する方法を学びます。本のコレクションを使い続け、特定のドキュメント属性を変更する方法を示します。

まず、MongoDBシェルに接続してmylab_databaseデータベースに切り替えましょう。

mongosh
use mylab_database

始めに、コレクション内の現在の本を確認しましょう。

db.books.find()

先ほど追加した本のリストが表示されるはずです。

[
  {
    _id: ObjectId('674681ac7b1f6d3a37c1c18c'),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId('674681ac7b1f6d3a37c1c18d'),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId('674681ac7b1f6d3a37c1c18e'),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

次に、updateOne()メソッドを使って特定のドキュメントを変更します。「JavaScript Fundamentals」のページ数を変更します。

db.books.updateOne(
    { title: "JavaScript Fundamentals" },
    { $set: { pages: 400 } }
)

このコマンドを分解してみましょう。

  • 最初の引数{ title: "JavaScript Fundamentals" }は、更新する特定のドキュメントを見つけるためのフィルターです。
  • $setは、特定のフィールドの値を変更する更新演算子です。
  • { pages: 400 }は、新しいページ数を400に設定します。

更新を検証するために、もう一度ドキュメントを見つけましょう。

db.books.find({ title: "JavaScript Fundamentals" })

ページ数が400に更新されたドキュメントが表示されるはずです。

バルク更新の実行

このステップでは、updateMany()メソッドを使ってMongoDBでバルク更新を行う方法を学びます。特定の条件に一致する複数のドキュメントを変更する必要がある場合、バルク更新は非常に強力です。

バルク更新を示すために、コレクションにさらにいくつかの本を追加しましょう。

db.books.insertMany([
    {
        title: "Advanced Python",
        author: "John Doe",
        year: 2019,
        price: 44.99
    },
    {
        title: "Data Science Handbook",
        author: "Jane Smith",
        year: 2021,
        price: 49.99
    }
])

次に、John Doeによるすべての本の価格を10ドル上げるバルク更新を行いましょう。

db.books.updateMany(
    { author: "John Doe" },
    { $inc: { price: 10 } }
)

このコマンドを分解すると、次のようになります。

  • { author: "John Doe" }はJohn Doeによるすべての本を選択します。
  • $incは、指定されたフィールドを増やす更新演算子です。
  • { price: 10 }は価格を10増やします。

John Doeによるすべての本を見つけることで更新を検証しましょう。

db.books.find({ author: "John Doe" })

「Machine Learning Basics」と「Advanced Python」の価格が10ドル上がっていることがわかるはずです。

2021年以前に出版されたすべての本にカテゴリを追加する別のバルク更新を行いましょう。

db.books.updateMany(
    { year: { $lt: 2021 } },
    { $set: { category: "Older Publication" } }
)

ここで、$ltは「未満」を意味し、2021年以前に出版されたすべての本に「Older Publication」カテゴリを追加して更新します。

更新演算子の使用

このステップでは、単なる値の変更にとどまらず、複雑なドキュメントの変更を行うことができる強力なMongoDBの更新演算子を探求します。

まず、使用するサンプルデータを作成しましょう。

db.products.insertMany([
    {
        name: "Laptop",
        price: 1000,
        tags: ["electronics", "computer"],
        stock: 50
    },
    {
        name: "Smartphone",
        price: 800,
        tags: ["electronics", "mobile"],
        stock: 30
    }
])

MongoDBは、いくつかの強力な更新演算子を提供しており、洗練された方法でドキュメントを変更することができます。

  1. $mul演算子 - 数値の乗算
db.products.updateOne(
    { name: "Laptop" },
    { $mul: { price: 1.1 } }
)

出力:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0,
  upsertedId: null
}

$mul演算子は、フィールドの値を指定された数で乗算します。この例では、ノートパソコンの価格を10%上げています。

  1. $push演算子 - 配列に要素を追加する
db.products.updateOne(
    { name: "Smartphone" },
    { $push: { tags: "sale" } }
)

出力:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0,
  upsertedId: null
}

$push演算子は、配列フィールドに要素を追加します。ここでは、スマートフォンのタグに「sale」タグを追加しています。

  1. $minおよび$max演算子 - 比較に基づく更新
db.products.updateOne(
    { name: "Laptop" },
    {
        $min: { stock: 40 },
        $max: { price: 1200 }
    }
)

出力:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0,
  upsertedId: null
}
  • $minは、指定された値が既存の値より小さい場合にフィールドを更新します。
  • $maxは、指定された値が既存の値より大きい場合にフィールドを更新します。

更新を検証しましょう。

db.products.find()
[
  {
    _id: ObjectId('674683aebec38876f7c1c18e'),
    name: 'Laptop',
    price: 1200,
    tags: [ 'electronics', 'computer' ],
    stock: 40
  },
  {
    _id: ObjectId('674683aebec38876f7c1c18f'),
    name: 'Smartphone',
    price: 800,
    tags: [ 'electronics','mobile','sale' ],
    stock: 30
  }
]

更新された価格、タグ、在庫レベルが反映された変更されたドキュメントが表示されるはずです。

更新結果の処理

このステップでは、MongoDBにおける更新操作の結果を処理して解釈する方法を学びます。更新結果を理解することで、更新が成功したことを確認し、その影響を把握することができます。

まず、使用するサンプルデータを作成しましょう。

db.users.insertMany([
    { name: "Alice", age: 28, status: "active" },
    { name: "Bob", age: 35, status: "inactive" },
    { name: "Charlie", age: 42, status: "active" }
])

次に、さまざまな更新結果のプロパティを探求しましょう。

  1. 基本的な更新結果
const result = db.users.updateOne(
    { name: "Alice" },
    { $set: { age: 29 } }
)

print("Matched Documents: " + result.matchedCount)
print("Modified Documents: " + result.modifiedCount)

出力:

Matched Documents: 1
Modified Documents: 1

結果オブジェクトには2つの重要なプロパティがあります。

  • matchedCount:フィルタに一致するドキュメントの数
  • modifiedCount:実際に変更されたドキュメントの数

これにより、更新操作中に何が起こったかを正確に理解することができます。matchedCountが0の場合、ドキュメントが見つかりませんでした。modifiedCountが0の場合、ドキュメントが一致した場合でも変更は行われていません。

  1. upsert操作
db.users.updateOne(
    { name: "David" },
    { $set: { name: "David", age: 25, status: "active" } },
    { upsert: true }
)

upsertは、一致するドキュメントが見つからない場合に新しいドキュメントを作成します。

  1. バルク更新結果
db.users.updateMany(
    { status: "active" },
    { $inc: { age: 1 } }
)

これは、バルク更新操作からの結果を取得する方法を示しており、アクティブなユーザーが何人一致して変更されたかを示しています。

更新を検証しましょう。

db.users.find()

更新されたデータの検証

このステップでは、MongoDBで更新されたデータを検証および照会するさまざまな方法を学びます。更新を確認することは、データの整合性を維持し、変更が正しく適用されていることを確認するために重要です。

検証手法を探求するためのサンプルデータを作成しましょう。

db.inventory.insertMany([
    {
        item: "laptop",
        quantity: 25,
        status: "available",
        category: "electronics"
    },
    {
        item: "smartphone",
        quantity: 15,
        status: "low stock",
        category: "mobile"
    }
])
  1. 正確な検証のための完全一致照会
db.inventory.updateOne(
    { item: "laptop" },
    { $set: { quantity: 30 } }
)

const laptopUpdate = db.inventory.findOne({
    item: "laptop",
    quantity: 30
})

print("Laptop Update Verified: " + (laptopUpdate!== null))

出力:

Laptop Update Verified: true

この方法は、更新された値と正確に一致するドキュメントが存在するかどうかを確認します。特定の更新を確認する最も直接的な方法です。

  1. 範囲に基づく検証
db.inventory.updateMany(
    { status: "low stock" },
    { $inc: { quantity: 5 } }
)

const updatedItems = db.inventory.find({
    quantity: { $gte: 20 }
}).toArray()

print("Updated Low Stock Items: " + updatedItems.length)

出力:

Updated Low Stock Items: 2

$gte(以上)のような比較演算子を使用することで、複数のドキュメントにわたる更新を検証することができます。

  1. 複雑な照会検証
db.inventory.updateOne(
    { item: "smartphone" },
    { $set: { status: "in stock" } }
)

const verifyUpdate = db.inventory.findOne({
    item: "smartphone",
    status: "in stock",
    category: "mobile"
})

print("Smartphone Status Updated: " + (verifyUpdate!== null))

出力:

Smartphone Status Updated: true

これは、複数の条件を同時に確認するより複雑な検証を示しています。

更新を確認するためにすべてのドキュメントを表示しましょう。

db.inventory.find()

まとめ

この実験では、MongoDBデータベース内の単一および複数のドキュメントを更新する方法を学びました。最初に、updateOne()メソッドを使用して特定のドキュメントを変更し、「JavaScript Fundamentals」の本のページ数を変更しました。次に、updateMany()メソッドを使用してバルク更新を行う方法を探求し、特定の条件に一致する複数のドキュメントを変更することができました。また、$setなどのさまざまな更新演算子について学び、フィールド値を変更するために使用しました。最後に、更新されたデータを検証して、変更が正常に適用されたことを確認しました。