一、实验目的
-
理解索引的概念及其在MongoDB中的重要性和作用。
-
学习如何选择适合建立索引的字段。
-
掌握如何创建、删除索引以及如何强制使用索引。
-
熟悉MongoDB的聚合框架和MapReduce工具,以及简单聚合命令的使用。
二、实验环境准备
-
JAVA环境准备:确保Java Development Kit (JDK) 已安装并配置好环境变量。
-
Hadoop环境准备:安装并配置Hadoop环境,确保Hadoop的各个组件可以在伪分布式模式下运行。
三、实验教材参考
《大数据存储》,谭旭,人民邮电出版社,2022,ISBN 978-7-115-59414-3。
四、实验内容与步骤
1、索引操作
-
创建文档并插入数据
db.createCollection("studata")
db.studata.insert({
name:"Alice",
age:22,
score:85,
class:"Physics"
})

db.studata.insert([
{ name: "Alice", age: 22, score: 85, class: "Physics" },
{ name: "Bob", age: 21, score: 78, class: "Chemistry" },
{ name: "Charlie", age: 23, score: 92, class: "Physics" },
{ name: "David", age: 20, score: 65, class: "Mathematics" }
]);

- 创建单字段索引
db.studata.createIndex({age:1})

- 创建复合索引
db.studata.createIndex({ class: 1, score: -1 });

- 创建文本索引
db.studata.createIndex({ name: "text" });

- 查看查询计划并评估单字段索引效果
db.studata.find({ age: 22 }).explain("executionStats");


- 查看查询计划并评估复合索引效果
db.studata.find({ class: "Physics", score: { $gt: 80 } }).explain("executionStats");


- 查看查询计划并评估文本索引效果
db.studata.find({ $text: { $search: "Alice" } }).explain("executionStats");


- 删除索引
删除单字段索引
db.studata.dropIndex({ age: 1 });

删除复合索引
db.studata.dropIndex({ class: 1, score: -1 });

2、聚合工具
- 统计文档数量
db.studata.aggregate([
{ $match: { class: "Physics" } },
{ $group: { _id: null, total_students: { $sum: 1 } } }
]);

- 获取字段唯一值
db.studata.distinct("class");

- 分组统计
db.studata.aggregate([
{ $group: {
_id: "$class",
total_students: { $sum: 1 },
average_score: { avg: "score" }
} }
]);

- 排序和限制
按分数降序排列,取前5名
db.studata.aggregate([
{ $sort: { score: -1 } },
{ $limit: 5 }
]);

- 使用MapReduce处理复杂的聚合任务
db.studata.mapReduce(
function() { emit(this.class, this.score); },
function(key, values) { return Array.sum(values); },
{
out: "class_total_scores"
}
);

查看 MapReduce 结果
db.class_total_scores.find();
