更新 MongoDB 数组

MongoDBMongoDBBeginner
立即练习

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

介绍

在本实验中,你将学习如何使用多种技术更新 MongoDB 数组,包括推送新元素、拉取数组项、更新数组元素、添加到数组集以及移除重复项。实验涵盖了实际示例和逐步指导,帮助你掌握 MongoDB 数据库中数组的管理。你将探索如何动态修改文档数据,并维护基于数组结构的完整性。

实验首先演示如何使用 $push 操作符向数组添加新元素。然后介绍 $pull 操作符,它允许你从数组中移除特定项。此外,你还将学习如何更新单个数组元素、向数组集添加元素以及从数组中移除重复项。这些技术将为你提供必要的技能,以便在 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/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/DataTypesGroup -.-> mongodb/manage_array_elements("Manage Array Elements") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/update_document -.-> lab-422095{{"更新 MongoDB 数组"}} mongodb/find_documents -.-> lab-422095{{"更新 MongoDB 数组"}} mongodb/work_with_array_data_types -.-> lab-422095{{"更新 MongoDB 数组"}} mongodb/manage_array_elements -.-> lab-422095{{"更新 MongoDB 数组"}} mongodb/query_embedded_documents -.-> lab-422095{{"更新 MongoDB 数组"}} mongodb/aggregate_group_totals -.-> lab-422095{{"更新 MongoDB 数组"}} end

推送新元素

在这一步中,你将学习如何使用 $push 操作符向 MongoDB 数组添加新元素。MongoDB 中的数组功能强大且灵活,允许你动态修改文档数据。

首先,让我们启动 MongoDB shell 并为实验创建一个数据库:

mongosh
use arraylab

接下来,创建一个名为 students 的集合,并插入一个包含课程数组的初始文档:

db.students.insertOne({
    name: "Alice Johnson",
    courses: ["Mathematics", "Computer Science"]
})

要向 Alice 的课程列表中添加一门新课程,我们将使用 $push 操作符:

db.students.updateOne(
    { name: "Alice Johnson" },
    { $push: { courses: "Data Structures" } }
)

让我们通过查找 Alice 的文档来验证更新:

db.students.find({ name: "Alice Johnson" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    courses: [ 'Mathematics', 'Computer Science', 'Data Structures' ]
  }
]

$push 操作符允许你向数组中添加元素。在这个例子中,我们向 Alice 的课程列表中添加了 "Data Structures"。

你还可以使用 $push$each 修饰符一次性推送多个元素:

db.students.updateOne(
    { name: "Alice Johnson" },
    { $push: { courses: { $each: ["Physics", "Chemistry"] } } }
)

这将 "Physics" 和 "Chemistry" 同时添加到 Alice 的课程数组中。

拉取数组项

在这一步中,你将学习如何使用 $pull 操作符从 MongoDB 数组中移除元素。基于上一步的内容,我们将继续使用 arraylab 数据库中的 students 集合。

首先,确保你已进入 MongoDB shell 并使用了正确的数据库:

mongosh
use arraylab

让我们验证现有的学生文档:

db.students.find({ name: "Alice Johnson" })

要从数组中移除特定项,我们将使用 $pull 操作符。让我们从 Alice 的课程中移除 "Physics" 课程:

db.students.updateOne(
    { name: "Alice Johnson" },
    { $pull: { courses: "Physics" } }
)

现在,让我们检查更新后的文档:

db.students.find({ name: "Alice Johnson" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    courses: [ 'Mathematics', 'Computer Science', 'Data Structures', 'Chemistry' ]
  }
]

你还可以使用 $pull 结合值数组来移除多个特定项:

db.students.updateOne(
    { name: "Alice Johnson" },
    { $pullAll: { courses: ["Mathematics", "Chemistry"] } }
)

$pullAll 操作符可以在一次操作中移除数组中所有指定的值。

让我们验证 Alice 课程的最终状态:

db.students.find({ name: "Alice Johnson" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    courses: [ 'Computer Science', 'Data Structures' ]
  }
]

更新数组元素

在这一步中,你将学习如何使用位置操作符和数组过滤操作符更新 MongoDB 数组中的特定元素。

首先,确保你已进入 MongoDB shell 并使用了正确的数据库:

mongosh
use arraylab

让我们创建一个更复杂的文档,其中包含学生课程的数组:

db.students.insertOne({
    name: "Bob Smith",
    courses: [
        { name: "Mathematics", grade: "B" },
        { name: "Computer Science", grade: "A" },
        { name: "Physics", grade: "C" }
    ]
})

要更新数组中的特定元素,我们将使用位置操作符 $。让我们更新 Computer Science 的成绩:

db.students.updateOne(
    { name: "Bob Smith", "courses.name": "Computer Science" },
    { $set: { "courses.$.grade": "A+" } }
)

让我们验证更新:

db.students.find({ name: "Bob Smith" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    courses: [
      { name: 'Mathematics', grade: 'B' },
      { name: 'Computer Science', grade: 'A+' },
      { name: 'Physics', grade: 'C' }
    ]
  }
]

我们还可以使用 $[] 操作符更新数组中的所有元素。让我们为所有课程添加一个学期:

db.students.updateOne(
    { name: "Bob Smith" },
    { $set: { "courses.$[].semester": "Fall 2023" } }
)

让我们检查最终的文档:

db.students.find({ name: "Bob Smith" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    courses: [
      { name: 'Mathematics', grade: 'B', semester: 'Fall 2023' },
      { name: 'Computer Science', grade: 'A+', semester: 'Fall 2023' },
      { name: 'Physics', grade: 'C', semester: 'Fall 2023' }
    ]
  }
]

添加到数组集

在这一步中,你将学习如何使用 MongoDB 中的 $addToSet 操作符向数组添加唯一元素,从而避免重复条目。

首先,确保你已进入 MongoDB shell 并使用了正确的数据库:

mongosh
use arraylab

让我们创建一个包含学生技能数组的新文档:

db.students.insertOne({
    name: "Emma Wilson",
    skills: ["Python", "JavaScript"]
})

$addToSet 操作符仅在元素不存在时将其添加到数组中:

db.students.updateOne(
    { name: "Emma Wilson" },
    { $addToSet: { skills: "Python" } }
)

让我们验证文档:

db.students.find({ name: "Emma Wilson" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Emma Wilson',
    skills: ['Python', 'JavaScript']
  }
]

注意,"Python" 没有被重复添加,因为它已经存在。

你还可以使用 $addToSet 结合 $each 一次性添加多个唯一元素:

db.students.updateOne(
    { name: "Emma Wilson" },
    { $addToSet: {
        skills: {
            $each: ["React", "Node.js", "Python", "TypeScript"]
        }
    } }
)

让我们检查最终的文档:

db.students.find({ name: "Emma Wilson" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Emma Wilson',
    skills: ['Python', 'JavaScript', 'React', 'Node.js', 'TypeScript']
  }
]

注意,"Python" 没有被重复添加,而新技能则被成功添加。

移除重复项

在这一步中,你将学习如何使用聚合和更新操作从 MongoDB 数组中移除重复元素。

首先,确保你已进入 MongoDB shell 并使用了正确的数据库:

mongosh
use arraylab

让我们创建一个包含重复技能的文档:

db.students.insertOne({
    name: "Michael Chen",
    skills: ["Python", "JavaScript", "Python", "React", "JavaScript", "Node.js"]
})

要移除重复项,我们可以使用 $addToSet 操作符,它会自动消除重复项:

db.students.updateOne(
    { name: "Michael Chen" },
    { $set: { skills: { $setUnique: "$skills" } } }
)

或者,我们可以使用聚合管道来移除重复项:

db.students.aggregate([
    { $match: { name: "Michael Chen" } },
    { $project: {
        name: 1,
        skills: { $setUnique: "$skills" }
    } },
    { $merge: { into: "students", on: "name", whenMatched: "replace" } }
])

让我们验证文档:

db.students.find({ name: "Michael Chen" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Michael Chen',
    skills: ['Python', 'JavaScript', 'React', 'Node.js']
  }
]

我们还可以演示如何在移除重复项的同时保持首次出现的原始顺序:

db.students.updateOne(
    { name: "Michael Chen" },
    { $set: {
        skills: Array.from(new Set(db.students.findOne({ name: "Michael Chen" }).skills))
    } }
)

让我们进行最终检查:

db.students.find({ name: "Michael Chen" })

总结

在本实验中,你学习了如何使用各种操作符更新 MongoDB 数组。首先,你学习了如何使用 $push 操作符向数组添加新元素,包括一次性添加多个元素。接着,你探索了如何使用 $pull 操作符从数组中移除特定项。此外,你还了解了如何更新数组中的单个元素,以及如何向数组集中添加元素以避免重复。这些技术为你在 MongoDB 应用中动态管理数组数据奠定了坚实的基础。