NoSQL数据库原理与应用综合项目——MongoDB篇

news2024/9/19 12:27:22

NoSQL数据库原理与应用综合项目——MongoDB篇

文章目录

  • NoSQL数据库原理与应用综合项目——MongoDB篇
    • 0、 写在前面
    • 1、本地数据或HDFS数据导入到MongoDB
    • 2、MongoDB数据库表操作
      • 2.1 Java API 连接MongoDB
      • 2.2 查询数据
      • 2.3 插入数据
      • 2.4 修改数据
      • 2.5 删除数据
    • 3、MongoDB数据库表进行数据分析
      • 3.1 统计各个类型书籍数量
      • 3.2 统计计算机类书籍中个别书籍的数量
      • 3.3 统计著名文人书籍数量
    • 4、Windows远程连接MongoDB(Linux)
    • 5、数据及源代码
    • 6、总结


在这里插入图片描述


0、 写在前面

  • Windos版本:Windows10
  • Linux版本:Ubuntu Kylin 16.04
  • JDK版本:Java8
  • Hadoop版本:Hadoop-2.7.1
  • HBase版本:HBase-1.1.5
  • Zookeepr版本:使用HBase自带的ZK
  • Redis版本:Redis-3.2.7
  • MongoDB版本:MongoDB-3.2.7
  • Neo4j版本:Neo4j-3.5.12 Community
  • IDE:IDEA 2020.2.3
  • IDE:Pycharm 2021.1.3

1、本地数据或HDFS数据导入到MongoDB

  • 代码:

创建db_books数据库以及集合tb_books

> use db_books;
switched to db db_books
> db
db_books
> db.createCollection('tb_books')
{ "ok" : 1 }
> show collections;
tb_books

为方便将数据导入MongoDB,需要将从MySQL导入的txt文件数据转换成JSON格式

此处使用Python处理,代码如下:

import os, json
with open("E:\\ tb_book.txt", encoding='utf-8') as file :
    lines = file.readlines()
    tolist = list()
    for data in lines :
        res = {}
        data = data.strip("\n")
        str = data.split("\t")
        res['id'] = str[0]
        res['type'] = str[1]
        res['name'] = str[2]
        res['author'] = str[3]
        res['price'] = str[4]
        res['discount'] = str[5]
        res['pub_time'] = str[6]
        res['pricing'] = str[7]
        res['publisher'] = str[8]
        res['crawler_time'] = str[9]
        tolist.append(res)
with open("E:\\ tb_book_out.txt", "w", encoding='utf-8') as outFile :
    jsonData = json.dumps(tolist)
    for row in jsonData :
        outFile.write(row)
  • 导入数据到MongoDB
zhangsan@node01:/usr/local/mongodb-3.2.7/bin$ ./mongoimport --db db_books --collection tb_books --type json --jsonArray --file /home/zhangsan/windowsUpload/data/tb_books.json

在这里插入图片描述

  • 运行成功图示:

数据总条数:

图片

  • 结果图:

图片

2、MongoDB数据库表操作

2.1 Java API 连接MongoDB

  • 设置控制台日志输出信息,设置为Level.SEVERE

代码具体见init()方法即可

  • 代码:
private static String dbName = "db_books";
private static String collectionName = "tb_books";
private static MongoClient client;
private static MongoDatabase db;
private static MongoCollection<Document> collection;

public static void init() {
    try {
        client = new MongoClient("10.125.0.15");
//            client = new MongoClient("localhost");
        db = client.getDatabase(dbName);
        collection = db.getCollection(collectionName);
        // TODO 设置console日志级别
        Logger mongoLogger = Logger.getLogger("org.mongodb.driver");
        mongoLogger.setLevel(Level.SEVERE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.2 查询数据

  • 查询前5条数据
/**
 * TODO 查询前5条数据
 */
public static void queryTop5() {
    FindIterable<Document> documents = collection.find().limit(5);
    for (Document document : documents) {
        System.out.println(document);
    }
    client.close();
}

图片

  • 按属性查询数据
/**
 * TODO 按属性查询数据
 * @param fieldName
 * @param fieldValue
 */
public static void queryOne(String fieldName, String fieldValue) {
    int size = 0;
    Bson filter = Filters.eq(fieldName, fieldValue);
    FindIterable findIterable = collection.find(filter);
    MongoCursor cursor = findIterable.iterator();

    try {
        if (!cursor.hasNext()) {
            System.out.println("Don't find what you want to query!");
        }
        while (cursor.hasNext()) {
            String next = cursor.next().toString();
            String[] split = next.split(",");
            for (int i = 0; i < split.length; i++) {
                if (i == 0) {
                    String prefix = split[i].substring(0, 9);
                    System.out.println(prefix);
                    System.out.println(" " + split[i].substring(10, 14) + "ObjectId(\"" +
                            split[i].substring(14) + "\")" + ",");
                } else if (i < split.length - 1){
                    System.out.println(split[i] + ",");
                } else {
                    System.out.println(split[i].substring(0, split[i].length() - 2));
                }
            }
            size++;
            if (size == 1 && !cursor.hasNext()) {
                System.out.println("}");
            } else {
                System.out.println("},");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    client.close();
}

图片

2.3 插入数据

  • 插入一条数据
/**
 * TODO 插入一条数据
 * @param values
 */
public static void insertOne(String[] values) {
    try {
        Document document = new Document()
                .append("id", values[0])
                .append("type", values[1])
                .append("name", values[2])
                .append("author", values[3])
                .append("price", values[4])
                .append("discount", values[5])
                .append("pub_time", values[6])
                .append("pricing", values[7])
                .append("publisher", values[8])
                .append("crawler_time", values[9]);
        collection.insertOne(document);
        System.out.println("document insert successfully!");
    } catch (MongoException me) {
        System.err.println("Unable to insert due to an error: " + me);
    }
    client.close();
}

图片

  • 插入多条数据
/**
 * TODO 批量插入数据
 * @param valuesList
 */
public static void insertBatch(List<String[]> valuesList) {
    int size = 1;
    List<Document> list = new ArrayList<Document>();
    for (String[] values : valuesList) {
        list.add(new Document()
                .append("id", values[0])
                .append("type", values[1])
                .append("name", values[2])
                .append("author", values[3])
                .append("price", values[4])
                .append("discount", values[5])
                .append("pub_time", values[6])
                .append("pricing", values[7])
                .append("publisher", values[8])
                .append("crawler_time", values[9])
        );
        if (list.size() == 2) {
            try {
                collection.insertMany(list);
                size *= 2;
                list.clear();
            } catch (MongoException me) {
                System.err.println("Unable to insert due to an error: " + me);
            }
        }
    }
    if (!list.isEmpty()) {
        try {
            collection.insertMany(list);
            size += 1;
            list.clear();
        } catch (MongoException me) {
            System.err.println("Unable to insert due to an error: " + me);
        }
    }
    System.out.println("Inserted" + size + " document successfully!");
    client.close();
}

在这里插入图片描述

2.4 修改数据

  • 修改一条数据
/**
 * TODO 修改一条数据
 * @param fieldName
 * @param fieldValue
 * @param newValue
 */
public static void updateOne(String fieldName, String fieldValue, String newValue) {
    // update one document
    Bson filter = eq(fieldName, fieldValue);
    try {
        collection.updateOne(filter, new Document("$set", new Document(fieldName, newValue)));
        System.out.println("update one document successfully!");
    } catch (MongoException me) {
        System.err.println("Unable to update due to an error: " + me);
    }
    client.close();
}

在这里插入图片描述

  • 修改多条数据
/**
 * TODO 修改多条数据
 * @param list
 */
public static void updateMulti(List<String[]> list) {
    // update one document
    int size = 0;
    for (String[] line : list) {
        String fieldName = line[0];
        String fieldValue = line[1];
        String newValue = line[2];
        Bson filter = eq(fieldName, fieldValue);
        UpdateResult updateResult = collection.updateMany(filter, new Document("$set", new Document(fieldName, newValue)));
        size += updateResult.getModifiedCount();
    }
    System.out.println("update " + size + " document successfully!");
    client.close();
}

在这里插入图片描述

2.5 删除数据

  • 删除一个文档
/**
 * TODO 删除一个文档
 * @param fieldName
 * @param fieldValue
 */
public static void dropOne(String fieldName, String fieldValue) {
    // TODO delete one document
    //  fieldName = name,fieldValue = 老舍

    Bson exists = exists(fieldName);
    // 申明删除条件
    Bson filter = eq(fieldName, fieldValue);

    try {
        DeleteResult result = collection.deleteOne(filter);
        System.out.println("Deleted document count: " + result.getDeletedCount());
    } catch (MongoException me) {
        System.err.println("Unable to delete due to an error: " + me);
    }
    client.close();
}

在这里插入图片描述

  • 删除多个文档
/**
 * TODO 删除多个文档
 * @param list
 */
public static void dropMany(List<String[]> list) {
    int size = 0;
    for (String[] line : list) {
        String fieldName = line[0];
        String fieldValue = line[1];
        Bson filter = Filters.eq(fieldName, fieldValue);
        try {
            DeleteResult result = collection.deleteMany(filter);
            size += result.getDeletedCount();
//                System.out.println("Deleted document count: " + result.getDeletedCount());
        } catch (MongoException me) {
            System.err.println("Unable to delete due to an error: " + me);
        }
    }
    System.out.println("Deleted document count: " + size);
    client.close();
}

在这里插入图片描述

3、MongoDB数据库表进行数据分析

3.1 统计各个类型书籍数量

> db.tb_books.aggregate([ { $group : { _id : "$type", total: { $sum: 1 } } } ])
{ "_id" : "type", "total" : 1 }
{ "_id" : "小说", "total" : 2740 }
{ "_id" : "计算机", "total" : 3035 }
{ "_id" : "社会科学", "total" : 2268 }
{ "_id" : "文学", "total" : 2761 }
{ "_id" : "科普百科", "total" : 2714 }

3.2 统计计算机类书籍中个别书籍的数量

> db.tb_books.find({name:{$regex:"java"}}).count()
5
> db.tb_books.find({name:{$regex:"算法"}}).count()
10
> db.tb_books.find({name:{$regex:"数据库"}}).count()
149
> db.tb_books.find({name:{$regex:"C++"}}).count()
761
> db.tb_books.find({name:{$regex:"Web"}}).count()
39

3.3 统计著名文人书籍数量

> db.tb_books.find({author:{$regex:"老舍"}}).count()
28
> db.tb_books.find({author:{$regex:"冰心"}}).count()
13
> db.tb_books.find({author:{$regex:"鲁迅"}}).count()
40
> db.tb_books.find({author:{$regex:"东野圭吾"}}).count()
6
> db.tb_books.find({author:{$regex:"太宰治"}}).count()
3
> db.tb_books.find({author:{$regex:"史铁生"}}).count()
6

4、Windows远程连接MongoDB(Linux)

MongoDB的相关配置文件需要提前设置正确,最主要的就是ip地址的设置,同时要注意防火墙是否关闭。

5、数据及源代码

  • Github

  • Gitee

6、总结

由于数据量只有1万多条,将数据导入MongoDB并不难,直接使用mongoimport命令即可,导入的时候注意数据的格式,默认是JSON格式的数据,当然也可以使用CSV格式的数据。

在删除、修改数据时,主要是要先匹配到条件,使用Filters.eq()方法即可,接着执行相应的操作,同时注意数据应该是文档类型new Document()例如:

  • find()
  • insertOne()
  • insertMany()
  • updateOne()
  • updateMany()
  • deleteOne()
  • deleteMany()

结束!

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

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

相关文章

Prettier系列之配置

文章の目录一、在文件目录中创建一个.prettierrc文件二、添加规则1、Print Width2、Tab Width3、Tabs4、Semicolons4.1、true----在每个语句的末尾添加一个分号。4.2、false----只在可能导致ASI失败的行开头添加分号。5、Quotes6、Quote Props6.1、as-needed6.2、consistent6.3…

Compose挑灯夜看 - 照亮手机屏幕里面的书本内容

一、前言 上一篇文章 Compose回忆童年 - 手拉灯绳-开灯/关灯里面82年钨丝灯&#xff0c;让我又有了新的想法&#xff0c;我们怎么照亮手机里面的文本内容呢&#xff1f; 我们会在上一篇文章的基础上来实现“挑灯夜看”的功能&#xff0c;怎么下手呢&#xff1f;往下看&#x…

小程序01/小程序 全局配置 tabBar 介绍、小程序模板语法数据绑定 wxml渲染

一.全局配置 tabBar 介绍 tabBar说明: tabBar是配置全局 页面底部导航 tabBar内包含 页面底部导航 背景 按钮 文字 文字颜色 注意: tabBar内list 最多是 5 项 &#xff0c;最少是 2 项 二.小程序模板语法数据绑定 说明: index.js文件data内定义属性 在index.wxml内渲染 in…

靠steam搬砖项目,傻瓜式操作单日500+,可放大操作

在分享干货之前&#xff0c;作为一个从15年开始创业的过来人&#xff0c;先教大家怎么分辨网络上的项目靠不靠谱&#xff0c;以后擦亮眼睛再做&#xff0c;切记&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、回本周期性我这个人比较俗&#xff0c;创业就是…

我的世界(MC) forge 1.19.3 开服教程

Debian系统使用MCSManager9面板搭建Minecraft Java版MOD服务器的教程&#xff0c;本教程用的forge1.19.3服务端&#xff0c;用其他服务端的也可以参考一下。 其他版本我的世界服务器搭建教程&#xff1a;https://blog.zeruns.tech/tag/mc/各种Minecraft服务端介绍和下载&#…

双线性变换法MATLAB实现巴特沃斯低通滤波器

实验名称 数字信号处理实验4 实验&#xff08;实习&#xff09;日期 12.13 得分 指导老师 学院 电信院 专业 电子信息工程 年级 2020 班次 姓名 学号 20208327 1.实验目的 掌握利用MATLAB求滤波器阶数和自然截至频率&#…

手把手带你理解TPS趋势分析

在性能分析中,前端的性能工具,我们只需要关注几条曲线就够了:TPS、响应时间和错误率。这是我经常强调的。 但是关注 TPS 到底应该关注什么内容,如何判断趋势,判断了趋势之后,又该如何做出调整,调整之后如何定位原因,这才是我们关注 TPS 的一系列动作。 今天,我们就通…

SSM闲置物品

14-13开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;基于s5m闲置物品交易系统 网站前台&#xff1a;关于我们、联系我们、公告信息、闲置物品、求购信息 管理员功能&…

SQL语句练习06

目录 一、建表 二、SQL语句练习 一、建表 一、建立如下学生表(命名格式“姓名拼音_三位学号_week8student”&#xff0c;如LBJ_023_week8student&#xff09; create table LYL_116_week8student(SNO int primary key, SNAME char(8) not null unique,SEX char(2), DEPTNO i…

初学Nodejs(7):mysql模块的简单使用

文章目录Nodejsmysql模块1、在项目中操作数据库的步骤1.1 安装操作mysql数据库的第三方模块&#xff08;mysql&#xff09;1.2 通过mysql模块连接到mysql数据库&#xff0c;并进行必要配置1.3 通过mysql模块执行sql语句1.3.1 查询数据1.3.2 插入数据插入数据的快捷方式1.3.3 更…

43_读写内部Flash实验

目录 STM32的内部FLASH简介 内部FLASH的构成 主存储器 系统存储区 对内部FLASH的写入过程 解锁 擦除扇区 写入数据 操作内部FLASH的库函数 FLASH解锁、上锁函数 设置操作位数及擦除扇区 写入数据 实验源码 STM32的内部FLASH简介 在STM32芯片内部有一个FLASH(nor …

vTESTstudio入门到精通 - vTESTstudio工具栏介绍_ Traceability Documentation Environment

由于Traceability & Documentation和Environment的两块内容较少&#xff0c;所以就合并起来介绍&#xff0c;单独的功能介绍略少&#xff0c;就不分开了&#xff0c;vTESTstudio工具栏介绍这块内容主要也是给大家做个普及&#xff0c;大家也是主要做个了解&#xff0c;方便…

可信启动、安全启动:SGX、TrustZone、SecureEnclave

最近在公众号上看到了一篇文章&#xff0c;算是又丰富了自己的安全方面的眼界。 最近看公众号取代了小视频、知乎这些东西。以前是真的不喜欢碎片化的东西&#xff0c;看什么学什么总是要找到书籍。但是这样的做法太过的极端&#xff0c;因为有时候有些事是两面性的。比如像安全…

SD nand与SD卡 SPI模式驱动

SD nand 与 SD卡的SPI模式驱动 文章目录SD nand 与 SD卡的SPI模式驱动1. 概述2. SPI接口模式与SD接口模式区别2.1 接口模式区别2.2 硬件引脚2.3 注意事项3. SD接口协议3.1 命令3.1.1 命令格式3.1.2 命令类型3.2 响应3.2.1 响应格式4. SD nand&#xff08;SD卡&#xff09;结构描…

小程序01/ 小程序 模板语法—条件渲染方式、小程序 模板语法-列表循环渲染方式

模板语法—条件渲染方式 1.wx:if 语法: 单分支: wx:if" 条件 " 双分支: wx:else 多分支: wx:elif" 条件 " 作用: 根据条件渲染 如果条件不满足 则该元素不会添加到DOM数 注意: wx:else前面必须要有 wx:if 或 wx:elif 2.hidden 语法: hidden&qu…

Vue Router安装与基本使用

Vue Router安装与基本使用(入门使用) 一、安装 npm install vue-router4在package.json 会配置一行 “vue-router”: “^4.1.6” 二、基本使用 2.1、新建路由器 新建 router文件夹 1个index.js文件 //1.定义路由组件 import Home from ../views/Home.vue import About from ..…

[附源码]Python计算机毕业设计Django学生社团信息管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

QtCreator同时运行多个程序

更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; QtCreator同时运行多个程序 在Windows下QtCreator默认只能运行一个程序&#xff0c;再次编译运行就会自动关闭之前运行的程序&#xff1b; 有时候我们想运行多个程序时&#x…

【电力系统】考虑储能优化的微网能量管理双层模型附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

一篇文章带你了解HBase、Zookeeper的安装部署

第 2 章 HBase 快速入门2.1 HBase 安装部署2.1.1 Zookeeper 正常部署2.1.2 Hadoop 正常部署2.1.3 HBase 的解压2.1.4 HBase 的配置文件2.1.5 HBase 远程发送到其他集群2.1.6 HBase 服务的启动2.1.7 查看 HBase 页面2.1.8 高可用&#xff08;可选&#xff09;2.2 HBase Shell 操…