当前位置: 首页 > article >正文

MongoDB的索引与聚合

一、实验目的

1.  理解索引的概念及其在MongoDB中的重要性和作用。

2.  学习如何选择适合建立索引的字段。

3.  掌握如何创建、删除索引以及如何强制使用索引。

4.  熟悉MongoDB的聚合框架和MapReduce工具,以及简单聚合命令的使用。

二、实验环境准备

1.  JAVA环境准备:确保Java Development Kit (JDK) 已安装并配置好环境变量。

2.  Hadoop环境准备:安装并配置Hadoop环境,确保Hadoop的各个组件可以在伪分布式模式下运行。

三、实验教材参考

《大数据存储》,谭旭,人民邮电出版社,2022,ISBN 978-7-115-59414-3。

四、实验内容与步骤

1、索引操作

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" }
]);

2. 创建单字段索引

db.studata.createIndex({age:1})

3. 创建复合索引

db.studata.createIndex({ class: 1, score: -1 });

4. 创建文本索引

db.studata.createIndex({ name: "text" });

5. 查看查询计划并评估单字段索引效果

db.studata.find({ age: 22 }).explain("executionStats");

6. 查看查询计划并评估复合索引效果

db.studata.find({ class: "Physics", score: { $gt: 80 } }).explain("executionStats");

7. 查看查询计划并评估文本索引效果

db.studata.find({ $text: { $search: "Alice" } }).explain("executionStats");

8. 删除索引

删除单字段索引

db.studata.dropIndex({ age: 1 });

删除复合索引

db.studata.dropIndex({ class: 1, score: -1 });

2、聚合工具

1. 统计文档数量

db.studata.aggregate([

  { $match: { class: "Physics" } },

  { $group: { _id: null, total_students: { $sum: 1 } } }

]);

2. 获取字段唯一值

db.studata.distinct("class");

3. 分组统计

db.studata.aggregate([

  { $group: {

      _id: "$class",

      total_students: { $sum: 1 },

      average_score: { $avg: "$score" }

  } }

]);

4. 排序和限制

按分数降序排列,取前5名

db.studata.aggregate([

  { $sort: { score: -1 } },

  { $limit: 5 }

]);

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();


http://www.kler.cn/a/513431.html

相关文章:

  • 光谱相机在智能冰箱的应用原理与优势
  • JDBC实验测试
  • 记一次数据库连接 bug
  • 美区TikTok解封后如何回归使用?
  • 通过Ukey或者OTP动态口令实现windows安全登录
  • 二十三种设计模式-装饰器模式
  • STM32G4xx系列boot0复用为IO注意事项
  • 分布式数据库中间件(DDM)的使用场景
  • 2021版小程序开发3——视图与逻辑
  • 【Python项目】主观题自动阅卷系统
  • Maxwell软件使用问题——旧版本打开新版本(The partner project name of the link cannot be empty)
  • Spring Boot Starter介绍
  • 「2024 博客之星」自研Java框架 Sunrays-Framework 使用教程
  • systemverilog中的force,release和assign
  • 《多模态语言模型:一个开放探索的技术新领域》
  • 智创 AI 新视界 -- AI 在交通运输领域的智能优化应用(16 - 9)
  • Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案
  • PHP 中调用京东商品详情 API 接口的示例
  • 深度剖析select与poll:网络编程的I/O多路复用基石
  • 总结5..
  • 从零开始打造一个Java基于 Spring Boot 的旅游信息化平台
  • [已解决]chatgpt被降智了怎么办?(无法联网、识别图片、文件、画图)
  • cmake 可使用的构建系统
  • Java如何向http/https接口发出请求
  • C++模拟实现queue
  • 人工智能与量子计算:未来编程的碰撞与共鸣