【大数据存储技术】实验2:MongoDB数据库的部署和操作 您所在的位置:网站首页 mongodb创建数据库集合 【大数据存储技术】实验2:MongoDB数据库的部署和操作

【大数据存储技术】实验2:MongoDB数据库的部署和操作

2024-07-16 17:29| 来源: 网络整理| 查看: 265

目录

1.实现MongoDB单实例的部署

1.1 安装MongoDB(Ubuntu版本:22.04 LTS)

1.1.1 查看Ubuntu版本

1.1.2 使用Ubuntu命令安装

1.2 启动MongoDB,验证状态

1.3 测试MongoDB

1.4 启动MongoDB Shell

2.使用Shell命令访问MongoDB数据库

2.1 数据库操作

2.1.1  数据库:查看、使用和删除数据库

2.1.2 集合:查看、创建和删除集合

2.1.3 文档:文档插入、文档查询、文档更新和文档删除

2.1.4 聚合和管道

2.1.5 索引:索引的创建、查看和删除

2.2 MongoDB数据库操作实例(用 MongoDB Shell 设计出 Student 集合)

3.编程实现MongoDB的访问

3.1 设计一个应用于实际场景的MongoDB数据库

3.2 Java访问该MongoDB数据库

3.2.1 idea连接MongoDB数据库(这一步是为了方便查看MongoDB)

3.1.2 Java连接MongoDB

 3.2.3 idea使用java操作MongoDB数据库

4. 实现MongoDB的集群化部署

4.1 复制集的部署(必选)

单机部署复制集

4.2 MongoDB集群的完整部署(可选)

[1-2参考大数据处理技术实验4]

1.实现MongoDB单实例的部署 1.1 安装MongoDB(Ubuntu版本:22.04 LTS) 1.1.1 查看Ubuntu版本

命令:lsb_release -a

1.1.2 使用Ubuntu命令安装

(1)更新系统包:

sudo apt update(可选)

sudo apt upgrade(可选)

sudo apt install dirmngr gnupg apt-transport-https ca-certificates software-properties-common

(2)安装MongoDB的依赖libssl1.1(安装curl后使用curl命令安装)

(3)运行下命令将 MongoDB 存储库添加到的 Ubuntu 系统(可选?)

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list

(4)添加MongoDB GPG密钥

wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -

(5)添加储存库,同时命令安装MongoDB服务包

sudo apt update

sudo apt install mongodb-org(sudo apt install -y mongodb-org)

1.2 启动MongoDB,验证状态

sudo systemctl enable mongod

sudo systemctl start mongod

sudo systemctl status mongod

1.3 测试MongoDB

mongo --eval 'db.runCommand({connectionStatus: 1})'

1.4 启动MongoDB Shell

mongo

·根据给出的Student文档完成操作

Student文档: { “name”: “zhangsan”, “score”:{ “English”: 70, “Math”: 80, “Computer”: 90 } } { “name”: “lisi”, “score”: { “English”: 30, “Math”: 40, “Computer”: 50 } }

2.使用Shell命令访问MongoDB数据库 2.1 数据库操作 2.1.1  数据库:查看、使用和删除数据库

·查看当前连接的服务器:db.getMongo()

·查看数据库列表:show dbs

·切换使用某个具体的数据库:use (存在-切换,不存在-创建)

执行use 指令后:

·查看数据库中的所有集合:show collections

·以JSON方式显示集合名称:db.getCollectionNames

·查看当前数据库中更详细的集合信息:db.getCollectionInfos()

·删除当前数据库:db.dropDatabase()

·显示当前数据库名称:db

2.1.2 集合:查看、创建和删除集合

·新建集合:db.createCollectioin()        【字符串作集合名加双引号,区分大小写】

·删除集合:db..drop()

2.1.3 文档:文档插入、文档查询、文档更新和文档删除

·文档插入:

·向文档中插入数据:db.COLLECTION_NAME.insert(document)

·插入或更新文档时,预先定义文档:

        doc1={item1:'item3',item2:'item4'}

        db.COLLECTION_NAME.insert(doc1)

·插入语句可以同时插入多个语句:db.COLLECTION_NAME.insert(doc1,doc2)

·查看集合中的全部文档:db.COLLECTION_NAME.find()

 

(这里把mycol写成了myccol,笑死)

 ·文档查询:

·返回集合的全部文档:

db.mycol.find()

db.mycol.find().pretty()

 ·文档更新:

文档更新的基本语法:

db.collection.update(

        ,

        ,

        {

                upsert:,

                multi:,

                writeConcern:

        }

)

·为查询条件

·为更新操作符:

        $set :设置一系列值

·upsert为布尔型可选项:不存在可以更新的记录,是否插入一个新值(默认false)

·multi为布尔型可选项:如果存在多个满足查询条件的记录,是否全部更新(默认false)

·writeConcern表示抛出异常的级别:是否在出现网络或服务器故障等时刻抛出错误信息(一般使用时不做设置)

·文档删除:

·删除文档的语法:

db.collection.remove(

        ,

        justOne:

)

为查询条件

justOne为可选的布尔型变量,说明㱙满足查询条件的文档是全部删除还是只删除一条,默认false(删除满足条件的全部文档)

·删除当前集合中的全部文档:

db.col.remove({})

2.1.4 聚合和管道

聚合操作通过aggregate语句实现(支持比较、逻辑、范围和聚合运算符,支持多种管道操作)

管道:将前一条语句的结果作为第二条语句的输入(MongoDB中可以理解为具体的聚合方法)

常见的管道操作:$group、$project、$match、$sort、$limit、$skip

常见的聚合运算符:$sum、$avg、$min/$max、$first/$last、$push

常见的比较运算符:$gt/lt、$gte/$lte、$ne

1. $group管道与分组求和

 2. $project、$match、$sort、$limit和$skip管道

(1)$project:对显示结果的字段进行调整。(find语句:projection)

(2)$match:过滤输出。(find语句:query参数)

(3)$sort:结果排序

(4)$limit、$skip:限制显示结果,以及略过返回结果的前几项

管道操作与其他聚合操作配合使用,形成更复杂的查询逻辑

 3. $unwind管道

作用:把一个集合列拆分为多个值(将一个文档拆分为多个文档显示)

4. 常见聚合运算符

(1)$sum:求和

(2)$min/$max:返回一个极值

(3)$avg:返回平均值

(4)$first/$last:将资源文档排序后,返回第一个或最后一个文档数据

(5)$push:将数值插入到一个数组中

2.1.5 索引:索引的创建、查看和删除

1. 维护索引

建立索引可以提高查询效率

示例语句:

db.mycol.createIndex({"item1":1})

db.mycol.createIndex({"item1":1,"item2":-1})

createIndex指令可以设置多个可选参数:

 其他常用可选参数:

unique:布尔型,表示是否建立唯一索引,默认false

dropdups:布尔型,表示是否删除重复记录,默认true

weights:整数型,取值在1~99999之间,表示和其他索引相比较的权重

查看某个集合的素有相关索引:db.mycol.getIndexes()

 删除索引:db.mycol.dropIndex("myindex")

删除一个集合的所有索引:db.mycol.dropIndexes()

 2. 全文索引

对字段建立“text”类型索引:db.mycol.createIndex({"item1":"text"})

针对多个字段建立索引:db.mycol.creeateIndex({"item1":"text","ietm2":"text"})

 (每个集合智能建立一个全文索引)

建立索引后可以进行检索:

对集合进行全文检索:db.mycol.find({$text:{$search:"first"}})

检索包含多个关键字其中之一的文档:db.mycol.find({$text:{$search:"first second"}})

检索包含“first”,但不包含“second”的记录:db.mycol.find({$text:{$search:"first -second"}})

检索包含“first item”完整词组的记录:db.mycol.find({$text:{$search:"\"first item\""}})

3. 地理位置索引(略)

2.2 MongoDB数据库操作实例(用 MongoDB Shell 设计出 Student 集合)

(1)创建数据库:

Use database_liuhao

(2)创建集合:

db.createCollection(“Student”)

(3)插入数据:

db.Student.insert( name:”zhangsan”, score:{ English:70, Math:80, Computer:90 } })

db.Student.insert( name:”lisi”, score:{ English:30, Math:40, Computer:50 } })

2.用 find()方法输出两个学生的信息。

db.Student.find()

db.Student.find().pretty() //易读方式

3.用 find()方法查询 lisi 的所有成绩(只显示 score 列)。

db.Student.find({ name:”lisi” }, { score:1, _id:0 })

4.修改 zhangsan 的 Math 成绩为 66。

db.Student.update({name:”zhangsan”},{$set:{“score.Math”:66}})

3.编程实现MongoDB的访问 3.1 设计一个应用于实际场景的MongoDB数据库

设计一个应用于实际场景的MongoDB数据库(至少包括两类实体和一个关系),描述数据库设计(画出MongoDB数据库,每个集合至少2个文档,每个文档至少4个键值对),以及如何进行实体和关系的增删改查。例如:学生+课程成绩,顾客+商品,用户+图书,客户+美食,医生+病人,游客+景点,住户+旅馆。

实验实例:学生+课程成绩(2.2 MongoDB数据库操作实例)

数据库:database_liuahao

文档:Student

3.2 Java访问该MongoDB数据库

Java访问该MongoDB数据库:实现数据库的连接、集合和文档的创建、文档的增删改查。

【这里使用idea自带的MongoDB插件实现连接】

3.2.1 idea连接MongoDB数据库(这一步是为了方便查看MongoDB)

(1)打开idea,新建Maven项目【注意是Maven项目!】

./bin/idea.sh

(2)idea连接MongoDB数据库

IDEA界面右侧,点击Database新建数据库,选择MongoDB。

 新建连接,并输入ip、端口、(用户名、密码)、数据库名等,点击测试连接

 Test Connection,出现Connection Test Successful ,则连接成功

若出现文件未安装,按idea推荐操作安装

3.1.2 Java连接MongoDB

在Maven项目中设置porm.xml文件

本人MongoDB版本5.0.3,所以安装mongodb-driver-sync版本为4.4.0

 3.2.3 idea使用java操作MongoDB数据库 1)建立连接,遍历数据库所有表内容 //连接到节点(mongod或mongos): MongoClient mongoClient = MongoClients.create("mongodb://localhost:27020"); //切换到testdb数据库和testcollection集合,不存在,则新建 MongoDatabase db = mongoClient.getDatabase("testdb"); ListCollectionsIterable collections = db.listCollections(); MongoCursor iter = collections.iterator(); while(iter.hasNext()) { System.out.println(iter.next()); } mongoClient.close() ➢ 删除数据库或集合: ⚫ db.drop(); ⚫ col.drop(); ➢ 关闭客户端连接: ⚫ mongoClient.close(); 2)表和数据操作 package org.example.CC; import com.mongodb.client.*; import org.bson.Document; //注意DBObject和BasicDBObject包需要预先import。 import com.mongodb.DBObject; import com.mongodb.BasicDBObject; //使用语句中的inc,以及lt、gt或eq等逻辑运算符,需要import相应的包: import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.mongodb.client.model.Filters.*; public class cc_test2 { public static void main(String args[]){ //连接到节点(mongod或mongos): MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017"); //切换到testdb数据库和testcollection集合,不存在,则新建 MongoDatabase db = mongoClient.getDatabase("testdb"); MongoCollection col = db.getCollection("testcollection"); //定义BSON文档,并追加内容: Document doc1 = new Document("name", "somefruits").append("count_of",3).append("varieties", Arrays.asList("banana","cherry","orange")); //还可以定义DBObject类型,并转换为Document类型: DBObject obj1= new BasicDBObject(); obj1.put("name", "more fruits"); obj1.put("count_of", 3); obj1.put("varieties ", "['banana','cherry','orange']"); Document doc2 = Document.parse(obj1.toString()); //插入一条数据: col.insertOne(doc1); //插入多条数据,需要首先定义一个Document列表: List documents = new ArrayList(); //在列表中加入若干Document元素(doc2): documents.add(doc2); //执行插入: col.insertMany(documents); // 查找 FindIterable findall = col.find(); //迭代器对象 MongoCursor iterator = findall.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } //删除一条或多条数据,参数为Document类型的删除条件: //deleteOne和deleteMany差别是前者在所有满足条件的文档中删除一条,而后者全部删除 col.deleteOne(doc1); col.deleteMany(new Document("name", "some fruits")); // 查找 FindIterable findall = col.find(); //迭代器对象 MongoCursor iterator = findall.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } //(条件)更新一条数据: col.updateOne( eq ("name", "more fruits"), new Document("$set", new Document("count_of", 4))); //$set的参数是一个文档类型,内容为字段和修改后的值。 //利用updateMany更新所有符合条件的数据( 利用$inc方法实现+1): col.updateMany(eq("name", "more fruits"),new Document("$inc", new Document("count_of", 1))); // 查找 FindIterable findall = col.find(); //迭代器对象 MongoCursor iterator = findall.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }

4. 实现MongoDB的集群化部署 4.1 复制集的部署(必选) 单机部署复制集 (1) 准备 ➢ 创建相关目录和文件 ⚫ 创建存放MongoDB副本集数据的目录: • $ mkdir -p /export/data/mongodb/replicaset1/data • $ mkdir -p /export/data/mongodb/replicaset2/data • $ mkdir -p /export/data/mongodb/replicaset3/data ⚫ 创建存放MongoDB副本集日志的目录: • $ mkdir -p /export/data/mongodb/replicaset1/logs • $ mkdir -p /export/data/mongodb/replicaset2/logs • $ mkdir -p /export/data/mongodb/replicaset3/logs ⚫ 在MongoDB副本集日志的目录下创建日志文件: • $ touch /export/data/mongodb/replicaset1/logs/mongodb.log • $ touch /export/data/mongodb/replicaset2/logs/mongodb.log • $ touch /export/data/mongodb/replicaset3/logs/mongodb.log 2)启动副本集 ➢ 以副本集的方法启动MongoDB ⚫ $ mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset1/data/ -- logpath=/export/data/mongodb/replicaset1/logs/mongodb.log --port 27018 --bind_ip localhost --logappend --fork ⚫ $ mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset2/data/ -- logpath=/export/data/mongodb/replicaset2/logs/mongodb.log --port 27019 --bind_ip localhost --logappend --fork ⚫ $ mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset3/data/ -- logpath=/export/data/mongodb/replicaset3/logs/mongodb.log --port 27020 --bind_ip localhost --logappend --fork ➢ 其中: ⚫ replSet: 指定副本集名称 ⚫ bind-ip:开启远程连接,使用当前服务器主机名 ⚫ logappend:指定以追加的方式写入日志 ⚫ fork:指定MongoDB后台启动 ⚫ 如果显示“child process started successfully”,证明启动成功

 3)初始化

➢ 连接到MongoDB: $ mongosh --host localhost --port 27018 ➢ 初始化方法1: ⚫ 执行:>rs.initiate() • 返回信息中字段“OK”的值为1,表示成功。 ⚫ 添加另外两个MongoDB到副本集: • > rs.add("localhost:27019") • > rs.add("localhost:27020")

➢ 初始化方法2: rs.initiate({_id:"test_replica_set", members:[{_id :0,host:“localhost:27018"},

{_id:1,host:" localhost:27019"}, {_id:2,host:" localhost:270120"]}) ➢ 执行成功后,shell环境的命令提示符会显示所在复制集名称,类似于: test_replica_set:PRIMARY 关闭复制集 ⚫ 关闭每个节点的MongoDB服务器: • $ mongod -shutdown --dbpath=/export/data/mongodb/replicaset1/data/ --port 27018 • $ mongod -shutdown --dbpath=/export/data/mongodb/replicaset2/data/ --port 27019 • $ mongod -shutdown --dbpath=/export/data/mongodb/replicaset2/data/ --port 27020 4.2 MongoDB集群的完整部署(可选)

【参考资料】

【大数据处理技术】实验4_小手の冰凉的博客-CSDN博客

25.聚合管道之$group操作_哔哩哔哩_bilibili

IDEA连接MongoDB - eosclover - 博客园

https://www.jianshu.com/p/534766a47165



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有