介绍
在本实验中,你将学习如何使用多种查询技术有效地过滤 MongoDB 集合。实验内容涵盖应用多个条件、使用比较运算符、匹配正则表达式、检查字段是否存在以及查找空值。这些技能对于查询和操作 MongoDB 中的数据至关重要,使你能够从数据库中提取精确且相关的信息。通过逐步的指导和实际示例,你将掌握 MongoDB 查询的基础知识。
在本实验中,你将学习如何使用多种查询技术有效地过滤 MongoDB 集合。实验内容涵盖应用多个条件、使用比较运算符、匹配正则表达式、检查字段是否存在以及查找空值。这些技能对于查询和操作 MongoDB 中的数据至关重要,使你能够从数据库中提取精确且相关的信息。通过逐步的指导和实际示例,你将掌握 MongoDB 查询的基础知识。
在这一步中,你将学习如何在查询 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 提供了强大的比较运算符,帮助你精确地过滤数据。让我们探索一些关键运算符:
$gt
) 和小于 ($lt
):db.students.find({ age: { $gt: 20, $lt: 25 } });
此查询查找年龄大于 20 但小于 25 的学生。在我们的示例中,这将返回 Alice。
$gte
) 和小于或等于 ($lte
):db.students.find({ credits: { $gte: 40, $lte: 50 } });
此查询查找学分在 40 到 50 之间(包括 40 和 50)的学生。这将返回 Alice 和 Charlie。
$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 中的正则表达式允许你执行复杂的文本搜索。让我们探索不同的正则表达式模式:
db.students.find({ name: { $regex: "^A" } });
此查询查找名字以 "A" 开头的学生。^
符号表示“以...开头”。
db.students.find({ email: { $regex: "@example.com$" } });
此查询查找电子邮件地址以 "@example.com" 结尾的学生。$
符号表示“以...结尾”。
db.students.find({ name: { $regex: "johnson", $options: "i" } });
此查询查找包含 "johnson" 的名字,不区分大小写。$options: "i"
使搜索不区分大小写。
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
运算符来检查字段是否存在:
db.students.find({ scholarship: { $exists: true } });
此查询返回具有奖学金字段的学生。在我们的示例中,这将返回 Alice 的文档。
db.students.find({ internship: { $exists: false } });
此查询返回没有实习字段的学生,包括 Alice、Bob 和 David。
$exists
与嵌套字段检查结合使用:db.students.find({
contact: { $exists: true },
"contact.phone": { $exists: true }
});
此查询查找具有联系字段且该字段包含电话子字段的文档,这将匹配 David 的文档。
关于字段存在性的关键点:
$exists: true
检查字段是否存在$exists: false
检查字段是否不存在在这一步中,你将学习如何在 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 值:
db.students.find({ email: null });
此查询返回 email 字段显式设置为 null 的文档。在我们的示例中,这将返回 Alice 的文档。
db.students.find({ age: null });
此查询查找 age 字段为 null 的文档。这将返回 Bob 的文档。
db.students.find({ "contact.email": null });
此查询查找嵌套的 contact 对象中 email 为 null 的文档,这将匹配 David 的文档。
db.students.find({
$and: [{ phone: null }, { phone: { $exists: true } }]
});
此查询查找 phone 字段存在且为 null 的文档。在我们的示例中,这将不会返回任何文档。
关于 null 值的关键点:
null
表示有意缺失任何对象值undefined
不同,后者表示变量尚未赋值$exists
检查字段是否存在在本实验中,你学习了如何在查询 MongoDB 集合时使用 $and
和 $or
运算符应用多个条件。这使你能够创建更精确和复杂的查询,从而有效地过滤数据。你还探索了各种比较运算符,例如 $gte
(大于或等于)和 $lt
(小于),以优化搜索条件。此外,你了解了如何匹配正则表达式、检查字段是否存在以及查找 MongoDB 集合中的 null 值,这些工具为你提供了强大的能力,能够有效地过滤和检索所需的数据。