更新 MongoDB 记录

MongoDBMongoDBBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用多种技术更新 MongoDB 记录,包括更新单个文档、执行批量更新以及使用更新操作符。你还将探索如何处理更新结果并验证更新后的数据。本实验涵盖了 MongoDB 中的基本 CRUD(创建、读取、更新、删除)操作,帮助你掌握在 MongoDB 数据库中有效管理数据所需的技能。

实验首先演示如何使用 updateOne() 方法更新单个文档,然后探索使用 updateMany() 方法进行批量更新。接着,你将深入了解如何使用更新操作符(如 $set)来修改文档中的特定字段。此外,你还将学习如何处理更新结果并验证更新后的数据,以确保 MongoDB 记录的完整性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ErrorHandlingGroup(["Error Handling"]) 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 shell 并切换到 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 表示“小于”,通过添加 "Older Publication" 类别来更新所有在 2021 年之前出版的书籍。

使用更新操作符

在这一步骤中,你将探索 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

结果对象提供了两个关键属性:

  • 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,并用它来更改字段值。最后,你验证了更新后的数据,以确保更改已成功应用。