过滤 MongoDB 集合

MongoDBMongoDBBeginner
立即练习

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

介绍

在本实验中,你将学习如何使用多种查询技术有效地过滤 MongoDB 集合。实验内容涵盖应用多个条件、使用比较运算符、匹配正则表达式、检查字段是否存在以及查找空值。这些技能对于查询和操作 MongoDB 中的数据至关重要,使你能够从数据库中提取精确且相关的信息。通过逐步的指导和实际示例,你将掌握 MongoDB 查询的基础知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/DataTypesGroup -.-> mongodb/use_numeric_data_types("Use Numeric Data Types") mongodb/DataTypesGroup -.-> mongodb/use_string_data_types("Use String Data Types") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") subgraph Lab Skills mongodb/find_documents -.-> lab-421806{{"过滤 MongoDB 集合"}} mongodb/query_with_conditions -.-> lab-421806{{"过滤 MongoDB 集合"}} mongodb/use_numeric_data_types -.-> lab-421806{{"过滤 MongoDB 集合"}} mongodb/use_string_data_types -.-> lab-421806{{"过滤 MongoDB 集合"}} mongodb/query_embedded_documents -.-> lab-421806{{"过滤 MongoDB 集合"}} end

应用多个条件

在这一步中,你将学习如何在查询 MongoDB 集合时应用多个条件。多个条件允许你创建更精确和复杂的查询,从而有效地过滤数据。

首先,打开终端并启动 MongoDB shell:

mongosh

现在,让我们创建一个学生样本集合来演示多条件查询:

use school_database

db.students.insertMany([
    { name: "Alice", age: 22, grade: "A", major: "Computer Science" },
    { name: "Bob", age: 20, grade: "B", major: "Mathematics" },
    { name: "Charlie", age: 25, grade: "A", major: "Physics" },
    { name: "David", age: 19, grade: "C", major: "Computer Science" }
])

让我们探索如何使用 $and 运算符应用多个条件。这允许我们指定必须同时满足的多个条件:

db.students.find({
  $and: [{ age: { $gte: 20 } }, { grade: "A" }]
});

此查询将返回年龄在 20 岁及以上且成绩为 "A" 的学生。让我们分解这些条件:

  • $gte 表示“大于或等于”
  • $and 确保两个条件都必须满足

你应该会看到类似以下的输出:

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    age: 22,
    grade: 'A',
    major: 'Computer Science'
  },
  {
    _id: ObjectId("..."),
    name: 'Charlie',
    age: 25,
    grade: 'A',
    major: 'Physics'
  }
]

我们还可以使用 $or 运算符来查找满足至少一个条件的文档:

db.students.find({
  $or: [{ major: "Computer Science" }, { age: { $lt: 21 } }]
});

此查询将返回主修计算机科学或年龄在 21 岁以下的学生。

  • $lt 表示“小于”

结果将包括像 David(21 岁以下)以及 Alice 和 David(主修计算机科学)的学生。

使用比较运算符

在这一步中,你将学习 MongoDB 的比较运算符,这些运算符可以帮助你创建更复杂的查询,以根据不同的条件过滤数据。

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

mongosh

让我们继续使用上一步中的 school_database。如果你已经关闭了 shell,请重新创建学生集合:

use school_database

db.students.insertMany([
    { name: "Alice", age: 22, grade: "A", major: "Computer Science", credits: 45 },
    { name: "Bob", age: 20, grade: "B", major: "Mathematics", credits: 35 },
    { name: "Charlie", age: 25, grade: "A", major: "Physics", credits: 50 },
    { name: "David", age: 19, grade: "C", major: "Computer Science", credits: 25 }
])

MongoDB 提供了强大的比较运算符,帮助你精确地过滤数据。让我们探索一些关键运算符:

  1. 大于 ($gt) 和小于 ($lt):
db.students.find({ age: { $gt: 20, $lt: 25 } });

此查询查找年龄大于 20 但小于 25 的学生。在我们的示例中,这将返回 Alice。

  1. 大于或等于 ($gte) 和小于或等于 ($lte):
db.students.find({ credits: { $gte: 40, $lte: 50 } });

此查询查找学分在 40 到 50 之间(包括 40 和 50)的学生。这将返回 Alice 和 Charlie。

  1. 不等于 ($ne):
db.students.find({ grade: { $ne: "C" } });

此查询返回成绩不为 "C" 的学生,即 Alice、Bob 和 Charlie。

让我们分解这些运算符:

  • $gt:大于
  • $lt:小于
  • $gte:大于或等于
  • $lte:小于或等于
  • $ne:不等于

每个查询都展示了使用比较运算符精确过滤数据的不同方式。

匹配正则表达式

在这一步中,你将学习如何在 MongoDB 中使用正则表达式(regex)在集合中执行灵活且强大的文本搜索。

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

mongosh

让我们继续使用 school_database 并添加一些更多样化的数据:

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, major: "Computer Science", email: "[email protected]" },
    { name: "Bob Smith", age: 20, major: "Mathematics", email: "[email protected]" },
    { name: "Charlie Brown", age: 25, major: "Physics", email: "[email protected]" },
    { name: "David Lee", age: 19, major: "Computer Engineering", email: "[email protected]" }
])

MongoDB 中的正则表达式允许你执行复杂的文本搜索。让我们探索不同的正则表达式模式:

  1. 查找以特定字母开头的名字:
db.students.find({ name: { $regex: "^A" } });

此查询查找名字以 "A" 开头的学生。^ 符号表示“以...开头”。

  1. 查找来自特定域名的电子邮件:
db.students.find({ email: { $regex: "@example.com$" } });

此查询查找电子邮件地址以 "@example.com" 结尾的学生。$ 符号表示“以...结尾”。

  1. 不区分大小写的正则表达式搜索:
db.students.find({ name: { $regex: "johnson", $options: "i" } });

此查询查找包含 "johnson" 的名字,不区分大小写。$options: "i" 使搜索不区分大小写。

  1. 部分匹配:
db.students.find({ major: { $regex: "Computer" } });

此查询查找专业中包含 "Computer" 的学生。

正则表达式模式提供了强大的数据搜索和过滤方式:

  • ^:以...开头
  • $:以...结尾
  • $options: "i":不区分大小写的匹配
  • 部分匹配不需要特殊符号

检查字段是否存在

在这一步中,你将学习如何使用强大的运算符检查 MongoDB 文档中字段的存在性,从而根据字段的存在与否过滤集合。

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

mongosh

让我们创建一个包含不同结构文档的集合,以演示字段存在性检查:

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, major: "Computer Science", scholarship: 1000 },
    { name: "Bob Smith", age: 20, major: "Mathematics" },
    { name: "Charlie Brown", age: 25, major: "Physics", internship: "Research Lab" },
    { name: "David Lee", age: 19, contact: { phone: "555-1234" } }
])

MongoDB 提供了 $exists 运算符来检查字段是否存在:

  1. 查找包含特定字段的文档:
db.students.find({ scholarship: { $exists: true } });

此查询返回具有奖学金字段的学生。在我们的示例中,这将返回 Alice 的文档。

  1. 查找不包含特定字段的文档:
db.students.find({ internship: { $exists: false } });

此查询返回没有实习字段的学生,包括 Alice、Bob 和 David。

  1. $exists 与嵌套字段检查结合使用:
db.students.find({
  contact: { $exists: true },
  "contact.phone": { $exists: true }
});

此查询查找具有联系字段且该字段包含电话子字段的文档,这将匹配 David 的文档。

关于字段存在性的关键点:

  • $exists: true 检查字段是否存在
  • $exists: false 检查字段是否不存在
  • 你可以创建复杂的查询来检查嵌套字段的存在性

查找 Null 值

在这一步中,你将学习如何在 MongoDB 中查找和处理 null 值,并理解 null、undefined 和缺失字段之间的区别。

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

mongosh

让我们创建一个包含 null 和 undefined 值的文档集合:

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, email: null },
    { name: "Bob Smith", age: null, major: "Mathematics" },
    { name: "Charlie Brown", age: 25, phone: undefined },
    { name: "David Lee", contact: { email: null } }
])

MongoDB 提供了特定的方法来查询 null 和 undefined 值:

  1. 查找包含 null 值的文档:
db.students.find({ email: null });

此查询返回 email 字段显式设置为 null 的文档。在我们的示例中,这将返回 Alice 的文档。

  1. 查找包含 null 字段的文档:
db.students.find({ age: null });

此查询查找 age 字段为 null 的文档。这将返回 Bob 的文档。

  1. 检查嵌套文档中的 null 值:
db.students.find({ "contact.email": null });

此查询查找嵌套的 contact 对象中 email 为 null 的文档,这将匹配 David 的文档。

  1. 区分 null 和缺失字段:
db.students.find({
  $and: [{ phone: null }, { phone: { $exists: true } }]
});

此查询查找 phone 字段存在且为 null 的文档。在我们的示例中,这将不会返回任何文档。

关于 null 值的关键点:

  • null 表示有意缺失任何对象值
  • undefined 不同,后者表示变量尚未赋值
  • 使用 $exists 检查字段是否存在
  • 注意嵌套文档的查询

总结

在本实验中,你学习了如何在查询 MongoDB 集合时使用 $and$or 运算符应用多个条件。这使你能够创建更精确和复杂的查询,从而有效地过滤数据。你还探索了各种比较运算符,例如 $gte(大于或等于)和 $lt(小于),以优化搜索条件。此外,你了解了如何匹配正则表达式、检查字段是否存在以及查找 MongoDB 集合中的 null 值,这些工具为你提供了强大的能力,能够有效地过滤和检索所需的数据。