MongoDB实训:电子商务日志存储任务

一、实验目的

1.  理解如何通过Java API连接MongoDB数据库。

2.  学习在Java中使用MongoDB进行数据库操作,包括插入数据、查询数据以及数据统计等。

3.  掌握电子商务日志数据在MongoDB中的存储和操作方法。

二、实验环境准备

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

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

三、实验教材参考

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

四、实验内容与步骤

1、连接MongoDB

使用Java API连接到MongoDB数据库,确保连接过程正确,可以通过主机名、端口号等方式连接到MongoDB服务器。

1. 首先在pom.xml中添加MongoDB的Maven依赖

2. 使用MongoDB Java驱动连接到MongoDB数据库。

(1)代码实现
 

private static final String DATABASE_NAME = "ECommerceDB";
private static final String COLLECTION_NAME = "Logs";
private static final String CONNECTION_STRING = "mongodb://192.168.10.200:27017";public static void main(String[] args) {try (MongoClient mongoClient = MongoClients.create(CONNECTION_STRING)) {System.out.println("Connected to MongoDB!");}
}

(2)运行结果

2、创建数据库和集合

在MongoDB中创建一个新的数据库,然后在该数据库中创建一个用于存储电子商务日志数据的集合。

1. 代码实现

private static MongoCollection<Document> setupDatabaseAndCollection(MongoDatabase database) {// 删除并重新创建集合(仅用于实验目的)MongoCollection<Document> collection = database.getCollection(COLLECTION_NAME);collection.drop();database.createCollection(COLLECTION_NAME);System.out.println("Database and Collection created!");return database.getCollection(COLLECTION_NAME);
}

2. 运行结果

3、插入日志数据

编写 Java 代码,将模拟的电子商务日志数据插入到 MongoDB 的集合中,确保插入操作成功。

1. 代码实现

private static void insertLogData(MongoCollection<Document> collection) {List<Document> logs = Arrays.asList(new Document("timestamp", "2025-01-08T10:00:00").append("product", "Laptop").append("category", "Electronics").append("price", 1200).append("quantity", 1),new Document("timestamp", "2025-01-08T11:30:00").append("product", "Phone").append("category", "Electronics").append("price", 800).append("quantity", 2),new Document("timestamp", "2025-01-08T12:00:00").append("product", "Headphones").append("category", "Accessories").append("price", 200).append("quantity", 5),new Document("timestamp", "2025-01-08T13:15:00").append("product", "Keyboard").append("category", "Accessories").append("price", 100).append("quantity", 3));collection.insertMany(logs);System.out.println("Log data inserted successfully!");
}

2. 运行结果

4、 查询日志数据

编写Java代码实现对MongoDB中日志数据的查询操作,可以包括基本的查询(如按时间范围查询、按商品名称查询)和复杂的查询(如多条件组合查询)。

1. 按时间范围查询

(1)代码实现

private static void queryLogsByTimeRange(MongoCollection<Document> collection, String startTime, String endTime) {System.out.println("\nQuery: Logs from " + startTime + " to " + endTime);Bson filter = Filters.and(Filters.gte("timestamp", startTime),Filters.lte("timestamp", endTime));FindIterable<Document> results = collection.find(filter);for (Document doc : results) {System.out.println(doc.toJson());}
}

(2)运行结果

2. 按商品名称查询

(1)代码实现

private static void queryLogsByProductName(MongoCollection<Document> collection, String productName) {System.out.println("\nQuery: Logs for product '" + productName + "'");Bson filter = Filters.eq("product", productName);FindIterable<Document> results = collection.find(filter);for (Document doc : results) {System.out.println(doc.toJson());}
}

(2)运行结果

5、分类统计

实现对日志数据的分类统计,例如统计某个时间段内的日志数量、按商品类别统计销售额等,确保统计结果准确。

1. 统计某时间段内日志数量

(1)代码实现

private static void countLogsByTimeRange(MongoCollection<Document> collection, String startTime, String endTime) {System.out.println("\nCount: Logs from " + startTime + " to " + endTime);Bson filter = Filters.and(Filters.gte("timestamp", startTime),Filters.lte("timestamp", endTime));long count = collection.countDocuments(filter);System.out.println("Number of logs in the specified time range: " + count);
}

(2)运行结果

2. 按商品类别统计销售额

(1)代码实现

private static void calculateSalesByCategory(MongoCollection<Document> collection) {System.out.println("\nSales by Category:");List<Bson> pipeline = Arrays.asList(Aggregates.group("$category",Accumulators.sum("total_sales", new Document("$multiply", Arrays.asList("$price", "$quantity")))));AggregateIterable<Document> results = collection.aggregate(pipeline);for (Document doc : results) {System.out.println(doc.toJson());}
}

(2)运行结果

6、完整代码

package com.example;
import com.mongodb.client.*;
import com.mongodb.client.model.*;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MongoDBConnection { private static final String DATABASE_NAME = "ECommerceDB";private static final String COLLECTION_NAME = "Logs";private static final String CONNECTION_STRING = "mongodb://192.168.10.200:27017";public static void main(String[] args) {try (MongoClient mongoClient = MongoClients.create(CONNECTION_STRING)) {System.out.println("Connected to MongoDB!");MongoDatabase database = mongoClient.getDatabase(DATABASE_NAME);MongoCollection<Document> collection = setupDatabaseAndCollection(database);insertLogData(collection);queryLogsByTimeRange(collection, "2025-01-08T10:00:00", "2025-01-08T12:00:00");queryLogsByProductName(collection, "Laptop");countLogsByTimeRange(collection, "2025-01-08T10:00:00", "2025-01-08T13:00:00");calculateSalesByCategory(collection);} catch (Exception e) {e.printStackTrace();}}/*** 初始化数据库和集合*/private static MongoCollection<Document> setupDatabaseAndCollection(MongoDatabase database) {// 删除并重新创建集合(仅用于实验目的)MongoCollection<Document> collection = database.getCollection(COLLECTION_NAME);collection.drop();database.createCollection(COLLECTION_NAME);System.out.println("Database and Collection created!");return database.getCollection(COLLECTION_NAME);}/*** 插入日志数据*/private static void insertLogData(MongoCollection<Document> collection) {List<Document> logs = Arrays.asList(new Document("timestamp", "2025-01-08T10:00:00").append("product", "Laptop").append("category", "Electronics").append("price", 1200).append("quantity", 1),new Document("timestamp", "2025-01-08T11:30:00").append("product", "Phone").append("category", "Electronics").append("price", 800).append("quantity", 2),new Document("timestamp", "2025-01-08T12:00:00").append("product", "Headphones").append("category", "Accessories").append("price", 200).append("quantity", 5),new Document("timestamp", "2025-01-08T13:15:00").append("product", "Keyboard").append("category", "Accessories").append("price", 100).append("quantity", 3));collection.insertMany(logs);System.out.println("Log data inserted successfully!");}/*** 按时间范围查询日志数据*/private static void queryLogsByTimeRange(MongoCollection<Document> collection, String startTime, String endTime) {System.out.println("\nQuery: Logs from " + startTime + " to " + endTime);Bson filter = Filters.and(Filters.gte("timestamp", startTime),Filters.lte("timestamp", endTime));FindIterable<Document> results = collection.find(filter);for (Document doc : results) {System.out.println(doc.toJson());}}/*** 按商品名称查询日志数据*/private static void queryLogsByProductName(MongoCollection<Document> collection, String productName) {System.out.println("\nQuery: Logs for product '" + productName + "'");Bson filter = Filters.eq("product", productName);FindIterable<Document> results = collection.find(filter);for (Document doc : results) {System.out.println(doc.toJson());}}/*** 统计某时间段内的日志数量*/private static void countLogsByTimeRange(MongoCollection<Document> collection, String startTime, String endTime) {System.out.println("\nCount: Logs from " + startTime + " to " + endTime);Bson filter = Filters.and(Filters.gte("timestamp", startTime),Filters.lte("timestamp", endTime));long count = collection.countDocuments(filter);System.out.println("Number of logs in the specified time range: " + count);}/*** 按商品类别统计销售额*/private static void calculateSalesByCategory(MongoCollection<Document> collection) {System.out.println("\nSales by Category:");List<Bson> pipeline = Arrays.asList(Aggregates.group("$category",Accumulators.sum("total_sales", new Document("$multiply", Arrays.asList("$price", "$quantity")))));AggregateIterable<Document> results = collection.aggregate(pipeline);for (Document doc : results) {System.out.println(doc.toJson());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 (59)无线个人区域网WPAN

前言 无线个人区域网&#xff08;WPAN&#xff0c;Wireless Personal Area Network&#xff09;是一种以个人为中心&#xff0c;采用无线连接方式的个人局域网。 一、定义与特点 定义&#xff1a;WPAN是以个人为中心&#xff0c;实现活动半径小、业务类型丰富、面向特定群体的无…

从spec到iso的koji使用

了解一下Linux发行版流程&#xff1a;:从spec到iso的koji使用 for Fedora 41。 Fedora 41有24235个包&#xff0c;我们选择 minimal 的几十个源码包&#xff0c;百多个rpm包构建。 配3台服务器 40C64G 44C64G 80C128G&#xff0c;有点大材小用&#xff0c;一台就够了 &#xf…

20250124-注意力机制(5-7)【3/3完结】 ——已复现

Attention Is All You Need&#xff08;注意力就是你所需要的一切&#xff09;&#xff08;5-7&#xff09;【3/3完结】 ——已复现 20250124-注意力机制&#xff08;1-2&#xff09;【1/3】 ——已复现-CSDN博客 20250124-注意力机制&#xff08;3-4&#xff09;【2/3】 ——已…

22_解析XML配置文件_List列表

解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…

[JavaScript] ES6及以后版本的新特性

文章目录 箭头函数&#xff08;Arrow Functions&#xff09;为什么需要箭头函数&#xff1f;箭头函数的完整语法箭头函数中的 this实用场景 解构赋值&#xff08;Destructuring Assignment&#xff09;为什么需要解构赋值&#xff1f;数组解构赋值的完整用法对象解构赋值的完整…

C语言进阶——3字符函数和字符串函数(2)

8 strsrt char * strstr ( const char *str1, const char * str2);查找子字符串 返回指向 str1 中第一次出现的 str2 的指针&#xff0c;如果 str2 不是 str1 的一部分&#xff0c;则返回 null 指针。匹配过程不包括终止 null 字符&#xff0c;但会在此处停止。 8.1 库函数s…

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用Composer初始化ThinkPHP 8应用_thinkphp8 compos…

飞行器半实物联合仿真:技术解析与应用实践

1.背景介绍 当前&#xff0c;飞行器已成为大国博弈复杂场景中的重要角色&#xff0c;其技术经过多次实践不断发展&#xff0c;性能持续提升&#xff0c;整体效能显著增强。随着计算机技术和系统仿真技术的发展&#xff0c;利用计算机模拟和仿真构造一个虚拟飞行器的飞行控制系…

c#配置config文件

1&#xff0c;引用命名空间 Configuration 及配置信息

【机器学习】机器学习引领数学难题攻克:迈向未知数学领域的新突破

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 一、引言 在数学的浩瀚领域中&#xff0c;存在着诸多长期未解的难题&#xff0c;这些难题犹如高耸的山峰&#xff0c;吸引着无数数…

OS Copilot功能测评:智能助手的炫彩魔法

简介&#xff1a; OS Copilot 是一款融合了人工智能技术的智能助手&#xff0c;专为Linux系统设计&#xff0c;旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程&#xff0c;重点评测了其三个核心参数&#xff1a;-t&#xff08;模式…

计算机网络 (55)流失存储音频/视频

一、定义与特点 定义&#xff1a;流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件&#xff0c;客户端可以通过互联网边下载边播放这些文件&#xff0c;也称为音频/视频点播。 特点&#xff1a; 边下载边播放&#xff1a;用户无需等待整个文件下载完成即可开始播放…

Oracle存储过程语法详解

简介 存储过程是一系列SQL语句的集合&#xff0c;可以封装复杂的逻辑&#xff0c;实现特定的功能&#xff0c;可以提高执行速度和代码的复用性&#xff0c;预先编译后存储在数据库中&#xff0c;可以通过指定存储过程的名称对其进行调用。 本文主要讲解Oracle存储过程语法&am…

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地&#xff0c;人左边、人右边、人上边、人下边 三结构准备 地图是什么&#xff0c;我们把地图想象成一个网格&#xff0c;每个格子就是工人每次移动的步长&#xff0c;也是箱子移动的距离&#xff0c;设置一个二维数…

如何分辨ddos攻击和cc攻击?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击和 CC&#xff08;Challenge Collapsar&#xff09;攻击都属于网络攻击手段&#xff0c;主要通过消耗目标服务器资源使其无法正常提供服务&#xff0c;但它们在攻击原理、攻击特征等方面存在区别&#xff1a; 攻击原理 DDoS 攻…

期权帮|如何利用股指期货进行对冲套利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何利用股指期货进行对冲套利&#xff1f; 对冲就是通过股指期货来平衡投资组合的风险。它分为正向与反向两种策略&#xff1a; &#xff08;1&#xff09;正向对冲&#xff…

软件质量与测试报告5-压力测试 JMeter 与 Badboy

A&#xff0e;百度搜索引擎压力测试 通过在Badboy下执行如下的测试场景来生成压力测试的脚本&#xff1a; a) 在Badboy的地址栏里面输入www.baidu.com&#xff0c;回车&#xff1b; b) 在右下区域打开的百度的主页上输入搜索关键字JMeter&#xff0c;回车&#xff1b; c) 在…

Mybatis多条件查询:Map传参与对象传参解析

Mybatis 多条件查询常见且关键&#xff0c;本文探讨两种方法——Map 传参和 Java Bean 对象传参&#xff0c;展示用法及区别&#xff0c;总结应用场景和优缺点。 1. Map传参方式 原理&#xff1a;Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中…

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…