MongoDB 数组操作指南

MongoDBMongoDBBeginner
立即练习

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

介绍

在本实验中,你将学习如何处理 MongoDB 数组,这是一种强大的数据结构,能够存储字符串、数字甚至嵌套文档等项目的列表。你将探索各种操作,包括创建数组字段、添加数组元素、删除数组项、更新数组值以及查询数组内容。这些技能将使你能够有效地管理和操作存储在 MongoDB 数组中的数据。

本实验涵盖以下步骤:创建数组字段、添加数组元素、删除数组项、更新数组值以及查询数组内容。通过本实验的学习,你将深入了解如何使用 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/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") 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") subgraph Lab Skills mongodb/insert_document -.-> lab-422084{{"MongoDB 数组操作指南"}} mongodb/update_document -.-> lab-422084{{"MongoDB 数组操作指南"}} mongodb/find_documents -.-> lab-422084{{"MongoDB 数组操作指南"}} mongodb/work_with_array_data_types -.-> lab-422084{{"MongoDB 数组操作指南"}} mongodb/manage_array_elements -.-> lab-422084{{"MongoDB 数组操作指南"}} mongodb/query_embedded_documents -.-> lab-422084{{"MongoDB 数组操作指南"}} end

创建数组字段

在这一步中,你将学习如何在 MongoDB 中创建数组字段,这允许你在单个文档中存储多个值。数组是一种强大的数据结构,能够存储字符串、数字甚至嵌套文档等项目的列表。

首先,让我们启动 MongoDB shell:

mongosh

接下来,为我们的实验创建一个数据库:

use arraylab

我们将创建一个名为 students 的集合,并插入一个包含数组字段的文档:

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

让我们分解这个示例:

  • 我们创建了一个包含 courses 字段的学生文档
  • courses 字段是一个包含三个字符串元素的数组
  • 每个学生可以在单个字段中存储多个课程

为了验证文档,让我们检索它:

db.students.find()

示例输出:

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

你也可以创建包含混合数据类型的数组:

db.students.insertOne({
    name: "Bob Smith",
    grades: [95, 87, 92],
    activities: ["Chess Club", "Debate Team"]
})

添加数组元素

在这一步中,你将学习如何使用不同的方法向 MongoDB 中的现有数组添加元素。我们将继续使用上一步中的 arraylab 数据库和 students 集合。

首先,确保你已进入 MongoDB shell:

mongosh

切换到 arraylab 数据库:

use arraylab

要向数组中添加单个元素,可以使用 $push 操作符:

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

让我们验证更新:

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

示例输出:

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

要一次性添加多个元素,可以使用 $push 结合 $each

db.students.updateOne(
    { name: "Bob Smith" },
    { $push: { activities: { $each: ["Robotics Club", "Swimming Team"] } } }
)

验证更新:

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

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 95, 87, 92 ],
    activities: [ 'Chess Club', 'Debate Team', 'Robotics Club', 'Swimming Team' ]
  }
]

删除数组项

在这一步中,你将学习如何使用不同的技术从 MongoDB 的数组中删除特定元素。我们将继续使用 arraylab 数据库和 students 集合。

首先,确保你已进入 MongoDB shell:

mongosh

切换到 arraylab 数据库:

use arraylab

要从数组中删除特定元素,可以使用 $pull 操作符:

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

让我们验证更新:

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

示例输出:

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

要删除多个特定元素,可以使用 $pullAll

db.students.updateOne(
    { name: "Bob Smith" },
    { $pullAll: { activities: ["Chess Club", "Debate Team"] } }
)

验证更新:

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

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 95, 87, 92 ],
    activities: [ 'Robotics Club', 'Swimming Team' ]
  }
]

如果你想通过位置删除元素,可以使用 $pop 操作符:

db.students.updateOne(
    { name: "Alice Johnson" },
    { $pop: { courses: 1 } }  // 删除最后一个元素
)

验证最终更新:

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

示例输出:

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

更新数组值

在这一步中,你将学习如何使用多种技术更新 MongoDB 数组中特定元素的值。我们将继续使用 arraylab 数据库和 students 集合。

首先,确保你已进入 MongoDB shell:

mongosh

切换到 arraylab 数据库:

use arraylab

要通过索引更新数组中的特定元素,可以使用位置操作符 $

db.students.updateOne(
    { name: "Alice Johnson", "courses": "Mathematics" },
    { $set: { "courses.$": "Advanced Mathematics" } }
)

让我们验证更新:

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

示例输出:

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

要更新多个数组元素,可以使用 $[](所有元素)或 $[<identifier>](筛选元素):

db.students.updateOne(
    { name: "Bob Smith" },
    { $mul: { "grades.$[]": 1.1 } }  // 将所有成绩提高 10%
)

验证更新:

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

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 104.5, 95.7, 101.2 ],
    activities: [ 'Robotics Club', 'Swimming Team' ]
  }
]

你还可以使用 $addToSet 向数组中添加唯一元素:

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

验证最终更新:

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

示例输出:

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

查询数组内容

在这一步中,你将学习如何基于 MongoDB 中的数组内容查询和筛选文档。我们将继续使用 arraylab 数据库和 students 集合。

首先,确保你已进入 MongoDB shell:

mongosh

切换到 arraylab 数据库:

use arraylab

要查找包含特定元素的数组的文档,可以使用直接匹配:

db.students.find({ courses: "Data Science" })

示例输出:

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

要查询包含多个特定元素的数组的文档,可以使用 $all 操作符:

db.students.find({
    courses: { $all: ["Advanced Mathematics", "Computer Science"] }
})

要查找数组中某个元素满足条件的文档,可以使用 $elemMatch 操作符:

db.students.find({
    grades: { $elemMatch: { $gt: 100 } }
})

此查询会查找至少有一个成绩大于 100 的文档。

要统计数组中元素的数量,可以使用 $size 操作符:

db.students.find({
    activities: { $size: 2 }
})

此查询会查找恰好有 2 个活动的文档。

让我们再添加一个文档以演示更复杂的查询:

db.students.insertOne({
    name: "Charlie Brown",
    courses: ["Art", "Music", "Literature"],
    grades: [88, 92, 85],
    activities: ["Painting Club"]
})

现在,让我们执行一个结合多个条件的更复杂查询:

db.students.find({
    $and: [
        { courses: { $in: ["Art", "Music"] } },
        { grades: { $elemMatch: { $gte: 90 } } }
    ]
})

此查询会查找课程中包含 "Art" 或 "Music" 并且至少有一个成绩大于或等于 90 的学生。

总结

在本实验中,你学习了如何在 MongoDB 中创建数组字段、向现有数组添加元素、删除数组项、更新数组值以及查询数组内容。你首先创建了一个数据库和一个名为 students 的集合,然后插入了包含 coursesgrades 等数组字段的文档。接着,你探索了多种操作数组的方法,例如使用 $push 操作符添加新元素、使用 $pull 操作符删除项以及使用 $set 操作符更新数组值。最后,你学习了如何使用 $in$all 操作符查询数组内容。本实验全面介绍了在 MongoDB 中处理数组的方法,为你提供了必要的技能,以便在你的 MongoDB 应用程序中高效管理和利用这一强大的数据结构。