irpas技术客

mongoDB:阶段一(引言,分布式集群概念,命令,Java集成mongoDB)_源远流长?_java 集成mongo

irpas 8223

前言

mongoDB引言 1.1 mongo概述 1.2 集群与分布式梳理mongodb与关系型数据库对比 + mongodb特点Linux系统安装MongoDBmongodb中的常用指令mongodb中的查询基本使用java集成mongodb 6.1 实战一:Java操作mongoDB 6.2 实战二:Springboot操作mongoDBmongodb阶段小结
前言

本章节主要讲解mongoDB的初步讲解,主要讲解的几点内容如下所示: 1.通过mnongoDB的基本概念,说明mongoDB为什么被称为"分布式>存储数据库"。 2.分布式与集群 3.mongoDB命令 4.Java集成mongoDB。

1、mongoDB引言 1.1 mongo概述 1. mongodb 是一个基于文档型的数据库;而redis是一个基于内存型的 数据库。 2. 我们将mongodb称为"分布式存储数据库"的原因? ⑴ 原因一:一般来讲我们平时在项目中使用'mongodb',若仅部署一个 mongodb通常是无法满足项目开发过程中的需求的,因此需要部署多台以此来 启动mongodb实例,并最后以此组成最终确实可以组成mongodb的集群。 --->但是又是为什么我们将mongodb称为分布式呢?原因就是mongodb中 存储的是'集合'的概念,我们是基于mongodb的这种存储特性去对其做拆分 的。我们一般在搭建mongodb集群并不是在每一个mongodb中去存储相同的数 据,而是将原来一个集合中的数据分别存储到多个mongodb中去,而日后 我去mongodb查询数据时会将这多个mongodb节点中的数据做一个汇总并 将最终的结果返回响应出去。 ⑵ 原因二:对于存储一个完整的数据我们利用mongodb是将这个完整数据分别 往不同的mongodb的节点中去存储的,因此后续若想要获取到完整的数据则必须 对所有的mongodb节点做整合(汇总)才可以获取到一个最终的完整数据,因此基于 上面说的在每一个mongodb节点中存储不同的数据的这个概念来讲所以我们才将 mongodb称为"分布式存储数据库"。 ⑶ 原因三:拿redis来讲对于redis:我们管它叫内存型数据库,同时也管 它叫'分布式缓存服务器'。我们搭建完redis集群之后,发现redis集群 的每一个节点里面存储的都不是一样的数据,再拿mencache来讲对于我们也 将其称为'分布式缓存服务器',是因为mencache的每一个节点中存储的也不是 相同的数据。 1.2 集群与分布式梳理 1. 什么是集群 ⑴ 多个节点干相同的事情 ⑵ 生活小栗子: 赛龙舟中每个划桨的人都是一个节点, 每个节点做相同的事情, 这就是集群. 2. 什么是分布式 ⑴ 多个节点协同完成一件事情, 每个节点做不同的事情. ⑵ 生活例子: 演出的一整个乐队中有的人弹吉他, 有的人打鼓, 有的人 吹小号. 并且共同完成一次演出, 这就是分布式. 3. 集群与分布式 ⑴ 不管在生活中, 还是在我们的实际项目中, 集群与分布式大多都是同时出现的。 ⑵ 生活例子: 龙舟比赛中划桨的人, 与打鼓的, 人与掌舵的人分别做不同的事情, 却共同完成赛龙舟这件事情, 这就是分布式. 同时划桨的多个人做着相同的事情, 这就是集群. 可见分布式与集群是同时出现的. 4. 集群&分布式 ⑴ 集群:完成同一个工作,创建多个tomcat服务器来承担现有系统的并发压力。 多个tomcat就称为集群。 ⑵ 分布式: ? 早期:所有业务都是写在同一个项目中的。之后我们会将一个完 整的项目部署到"tomcat应用服务器1"或者将项目部署到"tomcat应 用服务器2"上或者部署到"tomcat3"上 --->此时我们将此项目完整的部署到每一个tomcat应用服务器上, 我们管这个项目实际上是运行在集群这样的系统里面。 ? 现在:如果要将一个完整项目业务剥离出来。就类似将一个项目 拆分成-->订单业务系统,产品业务系统,用户业务系统...等等独 立的一个个单一项目业务并实现部署时也是需要部署到多台tomcat 应用服务器的。 a. '商品业务系统'部署到多个tomcat应用服务器上 (tomcat1,tomcat2,tomcat3)。 b. '产品业务系统'也部署到多个tomcat应用服务器上 (tomcat4,tomcat5,tomcat6)。 c. '用户业务系统'也部署到多个tomcat应用服务器上 (tomcat7,tomcat8)。 ..... --->这样的搭建方式是要通过多个tomcat应用服务器配合完成部 署的,对于实现这一过程的系统我们就管它叫做'分布式系统'。 5. 站在'分布式架构'和'项目'角度分析 ⑴ 站在整个分布式的架构里面,我们可以对它定义为:针对于同一种功 能(同一tomcat有多个)来讲我们可以管它叫集群。那么如果我们这个系统 既用了tomcat集群,又用了mysql集群我们就可以说我们的系统是'分布 式系统'。(因为tomcat和mysql它们所干的事情是不一样的) ⑵ 站在项目的层面上讲,将项目部署到多个tomcat应用服务器上,这个 项目实际上就是部署在集群的系统里面。日后如果将项目中独立拆分出一 个个完整的业务系统,每个业务系统都要部署到多个tomcat应用服务器 中-->日后我们管整个项目也称为'分布式系统'。 2. mongodb与关系型数据库对比 + mongodb特点 1. 关系型数据库(比如:mysql) ⑴ 对于mysql来讲"存储数据的顺序为":库-->表-->存字段数据 -->以 这种方式来存储数据。 ⑵ 对于mongodb来讲"存储数据的顺序为":库-->集合(类似mysql中的 表)-->存json数据 ⑶ 但是在整个'mongodb'中它是没有事务的概念的。如果我们对于数据 的原子性要求非常高的话就需要慎重考虑是否真的要去使用'mongodb'。 ? 在使用'mongodb'过程中,当发现少一个字段时我们可以直接对其 添加一个字段并赋值,当发现某个字段不需要时也可以直接动态的去 删除不需要的字段。但是'mongodb'并不能替代我们项目中的关系型 数据库(mysql),因为本身mongodb是没有'事务'的概念的,因此对 于数据'原子性'要求很高的话,则建议去使用'关系型数据库'去存储 数据。 --->因此在项目开发过程中,我们一般使用'mongodb'去配合关系型 数据库(mysql)同时使用的。 ? mongodb支持的数据结构非常松散,是类似json的bson格式,因 此可以存储比较复杂的数据类型。 ? mongodb的出现也确实减少了开发阶段'库表设计阶段'的时间。 2. mongodb特点 ⑴ 面向集合存储,易存储对象类型的数据 ⑵ 支持查询,以及动态查询 ⑶ 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言 ⑷ 文件存储格式为BSON(一种JSON的扩展) ⑸ 支持复制和故障恢复和分片 3. Linux系统安装MongoDB 1. 百度搜索安装mongodb地址: https://blog.csdn.net/dong0928/article/details/105197356 2. Linux下载安装MongoDB ⑴ 第一:将下载好的'mongodb-linux-x86_64-4.0.13.tgz'拉取到Linux系统中,并进行解压。 ? 解压mongodb [root@localhost ~]# tar -zxvf mongodb-linux-x86_64-4.0.13.tgz ? 将mongodb解压后生成的mongodb文件重命名 [root@localhost ~]# ll 总用量 83228 drwxr-xr-x. 3 root root 135 10月 13 09:37 mongodb-linux-x86_64-4.0.13 -rw-r--r--. 1 root root 85223276 10月 13 09:34 mongodb-linux-x86_64-4.0.13.tgz drwxr-xr-x. 2 root root 211 10月 13 09:36 soft [root@localhost ~]# mv mongodb-linux-x86_64-4.0.13 mongo ? 进入mongoDB 的包下,可以查看它里面的'/bin'目录里面存放了 mongodb启动的一些脚本文件。 ▲. mongodb作为一个nosql的产品,此数据库简单易用,简单到连配 置文件都没有 ▲. 要操作执行mongodb里面的可执行文件直接进入'/bin'目录里面 去执行即可。 --->对于解压后的mongodb.tgz如果想去使用它,我们直接使用即 可。 ? 启动mongodb 命令 a. 进入/bin目录 [root@localhost ~]# cd mongo [root@localhost mongo]# cd bin/ [root@localhost bin]# ls bsondump mongod mongofiles mongorestore mongotop install_compass mongodump mongoimport mongos mongo mongoexport mongoreplay mongostat b. 启动mongodb(若要启动mongodb,会用到/bin下 的'mongod'这个命令,此命令是用来启动mongodb服务的)。 # 在Linux系统中创建存储mongodb数据的文件夹(/data 目 录) [root@localhost ~]# pwd /root [root@localhost ~]# mkdir data # 启动mongodb,指定启动的默认端口号(27017),以及指定 mongodb数据的存储位置为根目录下的'/data目录' [root@localhost ~]# cd mongo [root@localhost mongo]# cd bin/ [root@localhost bin]# ./mongod --port 27017 --dbpath=/root/data/ ----->这里的"/root/data/"是我们创建用来存储mongodb数 据的目录位置。 ---->启动mongodb中出现"[initandlisten] waiting for connections on port 27017" (这句话意思:mongodb在等待客户端连接)说明mongodb服务已 经启动成功。 ⑵ 第二:通过mongodb的客户端去连接启动后的'mongodb服务'。 在mongodb的/bin目录下,有一个客户端启动的指令(就类似在cmd 中执行mysql连接mysql服务) a. 进入mongo/bin [root@localhost ~]# cd mongo [root@localhost mongo]# cd bin/ [root@localhost bin]# ls bsondump mongod mongofiles mongorestore mongotop install_compass mongodump mongoimport mongos mongo mongoexport mongoreplay mongostat b. 使用客户端指令去链接mongodb服务(默认连接端口为27017,默 认连接的IP地址为localhost),因此无需我们手动去指定连接的IP 地址和端口号。 [root@localhost bin]# ./mongo ------------------------------------------------------------------------------------ 3. mongodb 安装使用小结 ⑴ 启动mongodb(进入mongodb的bin目录执行启动指令),指定启动端口和mongodb数据存放路径 ./mongod --port=27017 --dbpath=/root/data ⑵ 客户端连接mongodb服务 ./mongo --port 27017 ⑶ 客户端连接'mongodb服务后'的基本操作命令 ? 指令一:在mongodb数据库中也有一个一个'库'的概念:查看 mongodb中的所有库 show databases; ? 指令二:使用一个库(选中一个库) use 库名; ? 指令三:查看当前所在的库 db; ? 指令四:若想自己创建一个mongodb的'库',在mongodb中不存在 创建'库'的指令。你直接使用一个不存在的'库'就表示创建一个数据 库。use 随便输入一个库名(比如:testDB); --->执行完此指令后就会在创建完'testDB'库后,自动切换 到'tetsDB数据库'。 ◆. 注意:对于刚创建的'testDB'数据库,我们使用'show databases'查看当前所有数据库,不会显示出我们刚创建的数据 库'testDB',因为mongoDB中不会显示库没有集合的库 ? 指令五:查看当前库中有哪些集合的指令 ◆. MongoDB的库中存储的是一个一个的集合,因此可以去查看 mongodb中存储的集合并集合存储到mongodb中。 a. 查看当前库中有哪些集合 show collections; 或者 show tables;--->两个指令均可 b. 创建集合(collection)-->在mongodb相当于关系型数据库 (mysql)中的表db.createCollection("创建的集合名"); 4. mongodb中的常用指令 1. mongodb的相关指令 ⑴ 查看库:show databases/dbs; ⑵ 使用库:use 库名 -->库不存在则创建并切换,库存在直接切换到当前库。 ⑶ 查询当前使用库:db ⑷ 删除一个库:db.dropDatabase(); # 删除一个库之前需要先进入要删除的库,在执行删除指令 ? 切换到使用的库下:use ems; ? 执行删除ems数据库指令:db.dropdatabase(); ? 查看'mongodb'下是否还存在'ems库':show dbs; ⑸ 查看所有mongodb的指令(帮助指令):db.help(); -------------------------------------------------------- 2. mongodb中的集合(collection)的相关指令 ⑴ 创建一个集合(两种方式) ? 方式一:显示创建--->db.createCollection("集合名称"); > use ems; #进入ems数据库 > db.createCollection("t_user"); #显示创建t_user集合 > show collections; #查看集合t_user是否创建成功 ? 方式二:隐式创建 > use ems; #进入ems数据库 > db.t_emp.insert({"name":"zhangsan"}) #显示创建t_emp集 合并插入一条记录 > show collections; #查看集合t_emp是否创建成功 ⑵ 查询库中存在那些集合: > use ems; #进入ems数据库 > show collections; 或 show tables; #查看库中的所有集合 ⑶ 删除库中集合: db.集合名.drop() ; > use ems; #进入ems数据库 > show collections; # 查看库中有哪些集合。 > db.t_user.drop(); # 删除t_user集合。 > show collections; # 查看将t_user删除后,t_user是否存在。 ⑷ 集合相关的帮助指令:db.集合名.help() > use ems; #进入ems数据库 > db.t_user.help() # 查看库中某一个集合的帮助指令。 ------------------------------------------------- 3. mongodb中集合的详细操作(CRUD增删改查) ⑴ 向集合中添加一条记录:db.集合名称.insert({"key":"value", "key1":"value1",....... )}; > use ems; #进入ems数据库 > show collections; # 查看库中有哪些集合。 > db.t_emp.insert({"name":"wangmazi",age:20,sex:true,bir:"2012-12-12"}); # 向集合t_emp中添加一条记录 ? 在insert("key":"value") 中,key可以不加双引号(""), value 如果不加双引号("")则代表这个插入的值是一个数字类型, 如果加双引号则代表此值是字符串类型。若是日期的话在mongodb中 实际上也是一个字符串类型的值,因此'日期'的值直接加上双引号即 可。 ? mongodb中所插入的'数字类型'是不区分'小数'和'整数'的。 ⑵ 查看集合中的所有记录:db.集合名称.find() > use ems; #进入ems数据库 > show collections; # 查看库中有哪些集合。 > db.t_emp.find(); #查询t_emp结合下的所有数据 { "_id" : ObjectId("6166493e908a8aadd402eab0"), "name" : "wangmazi", "age" : 20, "sex" : true, "bir" : "2012-12-12" } ? 注意1:在mongodb中一定会在底层帮我们生成一个'_id'的key和 value。我们可以自己去指定此'_id'的值,操作指令为↓: # 在ems数据下的t_emp集合中去创建一条记录,并制定"_id"的值。 >db.t_emp.insert({"_id":"20211013_1","name":"wangwu"}); # 查看在't_emp'集合下创建记录后的结果数据: > db.t_emp.find(); { "_id" : ObjectId("6166493e908a8aadd402eab0"), "name" : "wangmazi", "age" : 20, "sex" : true, "bir" : "2012-12-12" } { "_id" : "20211013_1", "name" : "wangwu" } ? 注意2:我们去指定"_id"的值时,去key必须取名为"_id",才可 以去指定它的具体value值。因此正常在mongodb的某一个数据库下 的集合中插入一条数据时,mongodb会默认在插入时自动创建一 个"_id"的key,并生成一个随机的默认值(此值我们可以自己去指 定)。 ⑶ 向集合中插入多条记录(在括号内嵌入一个[]括号,里面插入多条中括 号{}的记录数据) -->db.集合名称.insert([{"key":"value",...},{"key1":"value1",...}]}; ? mongodb客户端:插入多条记录命令演示: #进入ems数据库 > use ems; # 查看库中有哪些集合 > show collections; # 以上表示一次插入多条记录。 > db.t_emp.insert([{"id":"21","name":"wangxiaoer"},{"name":"xiaoming"},{"name":"windows7",age:23}]); # 查看一次插入3条数据的结果信息 > db.t_emp.find(); { "_id" : ObjectId("61664e2823dff133127daa3e"), "id" : "21", "name" : "wangxiaoer" } { "_id" : ObjectId("61664e2823dff133127daa3f"), "name" : "xiaoming" } { "_id" : ObjectId("61664e2823dff133127daa40"), "name" : "windows7", "age" : 23 } ? mongodb 支持使用JS语法插入多条数据(mongodb对js的脚本有 一定的支持)。 -->使用JS的for循环插入多条数据,如图所示-"图-js语法插入多条 数据"。 # 使用JS语法往mongodb中插入多条数据: for(var i=0;i<100;i++) ( db. 集合名称. inert({......}); } ⑷ 删除集合中的记录:db.集合名称.remove({"删除条件"}); # 删除 条件为空则默认删除所有 #进入ems数据库 > use ems; # 查看库中有哪些集合 > show collections; t_emp # 无删除条件,默认删除t_emp集合下的所有数据 > db.t_emp.remove({}); # 指定删除条件去删除结合下的指定数据(指定'删除name为张 三'和'age为20'的数据) --->指定多个条件进行删除数据,并集'and'(两个条件需同时满足) 的关系进行删除。 > db.t_emp.remove({name:"张三",age:20}); ⑸ 修改集合中的记录 ? db.集合名称.update({更新条件},{更新内容}); ▲. 注意1:使用这种方式的更新会'先将符合的数据删除,然后在将 修改的数据添加进去'。 ? db.集合名称.update({更新条件},{$set:{age:21,"address": ["北京","上海"]}}); --->此命令表示:根据更新条件去获取记录,若存在'age'数据则数 据更新为21,若不存在 'address'数据或'age'数据则将数据添加进去。 ▲. 注意2:使用这种方式的更新mongodb只能修改符合条件的第一条 记录 ? db.集合名称.update({"name":"zhangsan"},{$set: {age:17}},{multi:true}); --->此命令表示:根据"name=zhangsan"这个条件去将'age'的key 修改为17,若age存在则修改,age不存在则条件,"multi:true"的 意思是:如果匹配多条数据则全部匹配的数据进行更新修改。 ▲. 注意3:使用这种方式的更新mongodb 会更新符合条件的多条记 录数据。 (multi=true)是开启多行更新,默认是false。 ? db.集合名称.update({"name":"xxx"},{$set:{age:26}}, {multi:true,upsert:true}); --->此命令表示:根据"name=xxx"这个条件去匹配查询数据,若不 存在此数据则将'age:26'这条数据插入进去。配置 了'upsert:true'就可以实现将没有符合条件的数据将要更新的数据 插入进去。 -->'upsert:true':没有符合条件时插入数据。 -->'multi:true':开启多行更新。 ▲. 注意4:使用这种方式的更新mongodb,对于添加 了'upsert:true'会将没有服务条件的数据插入到mongodb中。 ? 小结:整个mongodb中的修改器总共有两个:$set + $inc $inc:让某个集合中的数字类型的key自增多少(使用$inc让指定 字段自增长指定步长) db.集合名称.update({"name":"zhangsan"},{$inc: {age:10,id:1}}); --->此使用了"$inc"指令的意思为:将条件为 ("name":"zhangsan")的数据将里面的"age自增10和id自增1"。 ⑹ 查询集合中的记录 ? db.集合名称.find(); # 查询集合中所有数据 ? db.集合名称.count(); #查询集合总条数 5. mongodb中的查询基本使用 1. 下面对MongoDB中集合的相关操作(mongodb查询基本指令)进行演示。 --->集合查询操作。 ⑴ 查询所有:db.集合名称.find(); ⑵ 查询一个:db.集合名称.findOne(); 加入条件查询福州添加数据, 没加入添加查询第一条数据。 ⑶ 条件查询: db.集合名称.find({"name":"xxx",...}})|findOne({"name":"xxx",.....}); --->若存在多个条件则它们之间的关系是'and'(必须满足所有条件才可 以)。 ▲. 注意:如果使用findOne()根据指定条件查询出来的数据有多条,则 显示满足条件的第一条数据。 ⑷ 指定查询结果显示的key: ? 语法格式:db.集合名称. find({查询条件}, {}用来指定显示字 段1}); db.t_user.find({},(name:1, age:1}) ? 0和1参数说明: 0:代表查询的结果中不显示这个字段 1:代表查询的结果中只显示哪个字段 ? 注意:在查询条件中不能同时使用"0"和"1"。 ⑸ 查询结果排序 ? db.集合名称.find().sort({条件 name:1,age:-1}) 1:代表升序 -1:代表降序 ? 例子: db.t_user.find().sort({age:-1}); --->将查询结果根据'age'进行降序排序。 ⑹ 分页查询: ? 语法格式:db.集合名称.find({...}).skip(起始条 数).limit(每页显示记录数); ? 例子: db.t_user.find().sort({age:-1}).skip(0).limit(2); --->表示:查询集合t_user,根据age的降序查询,查询第一 页每页显示2条数据。 db.t_user.find().sort({age:-1}).skip(2).limit(2); --->表示:查询集合t_user,根据age的降序查询,查询第二 页每页显示2条数据。 ? 通用语法:db.集合名称.find({...}).skip((pageNow- 1)*pageSize).limit(pageSize); -->因此这里的分页和'mysql'的分页语法是一模一样的。 ⑺ 总条数查询 ? db.集合名称.count(); #查询集合总条数 ? db.集合名称.find({查询条件}).count(); #基于条件查询之后 的总条数 db.t_user.find({age:20}).count(); #表示查询'age为 20'的数据的总条数。 ⑻ 模糊查询:通过'正则表达式'来模拟的查询。 ? 在mongodb中并没有给我们提供'模糊查询'的查询语法,mongodb 中没有'Like',因此如果打算在mongodb中实现模糊查询的相关操作 只能去使用'正则表达式'。 --->正则表达式是以'/'开头,'/'结尾的,然后在两个斜杠"/"中间 加入要哪个字段中包含的数据。 db.t_user.find({name:/ao/}) -->表示:查询't_user'集合中name包含'ao'值的数据。 -->注意:在/ao/ 两边不要加双斜杠。 ? mongodb 使用正则表达式的'错误和正确'写法: db.集合名称.find({name: "/ao/"}); //错误写法 db.集合名称.find({name:/ao/}); //正确写法 --->注意:不要在使用正则表达式时加入双引号. ----------------------------------------------------- 2. mongodb中的高级查询语法 ⑴ 等值查询(=):$eq ? 等值查询的两种语法使用方式 a. 方式一: db.集合名称.find({name:"zhangsan"}); b. 方式二: db.集合名称.find({name:{$eq:"zhangsan"}}); ⑵ 且(and)查询:多条件并列查询,需同时满足条件。 # 以下演示两个实现且查询的方式 ? 方式一: db.集合名称.find({name:"aa",age:20}); --->查询集合中符合'name为aa'并且'age为20'的数据。 ? 方式二:使用'$and' db.集合名称.find({ $and:[ {name:"aa"}, {age:20} ] }); --->使用'$and'来实现并列查询,将两个条件连接到一起实现查 询。 ⑶ or 查询($or):根据查询结果只要符合任意一个条件即可。 ? $or 使用语法 db.集合名称.find({ $or:[ {name:"a"}, {age:20} ] }); --->以上表示:只要满足'name为a'或者'age为20'其中一个条件即 可实现数据查询。 ? 另一种写法 db.集合名称.find({ $or:[ {name:"a",age:30}, {age:20} ] }); --->以上表示:我们在同一个{}中写入两个条件就表示 'name=a且age=30'这两个条件必须同时满足,或者满足age=20这个 条件的数据均会被查询出来。所以写在同一个{}中的数据需要同时满 足的关系。 ⑷ 运算相关:>($gt), <($lt), >=($gte), <=($glte), =($eq) # 运算相关例子说明 ? db.t_user.find({age:{$eq:15}}) ---->查询集合't_user'中age等于15的数据。 ? db.t_user.find({age:{$gt:15}}) ---->查询集合't_user'中age大于15的数据。 ? db.t_user.find({age:{$lte:15}}) ---->查询集合't_user'中age小于等于15的数据。 ? 区间查询案例演示: # 案例一: 查询'age'年龄大于3,小于等于15的数据。 db.t_user.find({age:{$gt:3,$lte:15}}) # 案例二:查询name为zhansgan,或者age大于3,小于等于15 的数据 db.t_user.find({ $or:[ {name:"zhangsan"}, {age:{$gt:3,$lte:15}} ] }); ⑸ not or ($nor):查询'既不是条件1,也不是条件2'之外的数据 ? not or 例子: # 查询集合t_user中数据既不包含'name=a'也不包含'age=8'之外 的数据。 db.t_user.find( {$nor:[ {name:"a"}, {age:8} ]}); 6. java集成mongodb 1.注意:无论使用'java亦或springboot操作mongoDB' 我们都需要去引入mongoDB的java客户端依赖。 6.1 实战一:Java操作mongoDB 1. Java操作mongoDB代码实战,如下所示↓: ⑴ 第一:pom.xml引入相关依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.linzk</groupId> <artifactId>mongoDBclient</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> <!-- mongodb 与 java连接的依赖 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project> ⑵ 第二:代码完成Java集成mongoDB ?. mongoClient客户端代码演示一: /** * MongoDB基础APi */ public class mongoClient { /* java操作mongoDB 1. 注意:在mongoDB3.6之后,它默认只允许localhost进行连接, 因此我们需要去实现远程连接mongoDB的话,需要做如下操作: 第一步:关闭linux系统的防火墙。 第二步:开启mongoDB的多客户端连接 -->在启动mongodb时候执行开启多客户端连接。 ./mongod --port=27017 --dbpath=/root/data --bind_ip 0.0.0.0 */ private MongoClient mongoClient; @Before public void before() { mongoClient = new MongoClient("192.168.35.163", 27017); } //获取mongoDB中所有数据库名 @Test public void testDatabaseNames() { MongoIterable<String> mongoIterable = mongoClient.listDatabaseNames(); for (String dataBaseName : mongoIterable) { System.out.println(dataBaseName); } } /* 获取所有集合名称 */ @Test public void test() { //获取指定库 MongoDatabase ems = mongoClient.getDatabase("ems"); //获取所有集合 MongoIterable<String> mongoIterable = ems.listCollectionNames(); for (String name : mongoIterable) { System.out.println(name); } } //获取指定集合 @Test public void test2() { MongoDatabase ems = mongoClient.getDatabase("ems"); MongoCollection<Document> t_emp = ems.getCollection("t_emp"); System.out.println(t_emp); } //获取集合中的所有数据 @Test public void test3() { MongoCollection<Document> collection = mongoClient.getDatabase("ems").getCollection("t_emp"); FindIterable<Document> documents = collection.find(); for (Document document : documents) { System.out.println(document.get("name" + "======")); System.out.println(document.get("age" + "======")); } } /* 保存一条记录 */ @Test public void test4() { MongoDatabase ems = mongoClient.getDatabase("ems"); MongoCollection<Document> t_emp = ems.getCollection("t_emp"); Document document = new Document(); document.put("_id","1001"); document.put("name","xx20211014"); document.put("age",23); document.put("bir",new Date()); t_emp.insertOne(document); } //保存多条数据 @Test public void test5() { MongoDatabase ems = mongoClient.getDatabase("ems"); MongoCollection<Document> t_emp = ems.getCollection("t_emp"); List<Document> list = new ArrayList<Document>(); Document document = new Document(); document.put("_id","1002"); document.put("name","aa20211014"); document.put("age",25); document.put("bir",new Date()); Document document1 = new Document(); document1.put("_id","1003"); document1.put("name","ss20211014"); document1.put("age",26); document1.put("bir",new Date()); list.add(document); list.add(document1); t_emp.insertMany(list); } //删除一条记录 @Test public void test6() { MongoCollection<Document> t_emp = mongoClient.getDatabase("ems").getCollection("t_emp"); Document document = new Document(); document.put("_id","20211013_1"); t_emp.deleteOne(document); } //删除多个数据 @Test public void test7() { MongoCollection<Document> t_emp = mongoClient.getDatabase("ems").getCollection("t_emp"); Document document = new Document(); document.put("_id","1001"); t_emp.deleteMany(document); } //查询总条数 @Test public void test8() { MongoCollection<Document> t_emp = mongoClient.getDatabase("ems").getCollection("t_emp"); System.out.println("t_emp库下的集合总条数为:" + t_emp.count()); } @After public void after() { mongoClient.close(); } } ---------------------------------------------------- ? TestMongo001代码实现演示二: public class TestMongo001 { private MongoClient mongoClient; @Before public void before(){ mongoClient = new MongoClient("192.168.28.136",27017); } /** * 获取所有集合名称 */ @Test public void testGetCollectionNames(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoIterable<String> strings = database.listCollectionNames(); for (String name : strings) { System.out.println(name); } } /** * 获取指定的集合 */ @Test public void testGetCollection(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("t_user"); } /** * 获取指定集合中的所有数据 */ @Test public void testGetCollectionFindAll(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("t_user"); FindIterable<Document> documents = collection.find(); for (Document document : documents) { System.out.println(document); System.out.print(document.get("name")+"==="); System.out.print(document.get("age")+"==="); System.out.println(); } } /** * 保存一条数据 */ @Test public void testSave(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> t_user = database.getCollection("t_user"); Document document = new Document(); document.put("_id","1"); document.put("name","xiaochen"); document.put("age",23); document.put("bir",new Date()); t_user.insertOne(document); } /** * 保存多条数据 */ @Test public void testSaveMany(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> t_user = database.getCollection("t_user"); List<Document > list = new ArrayList<Document>(); Document document = new Document(); document.put("_id","3"); document.put("name","aaa"); document.put("age",23); document.put("bir",new Date()); Document document1 = new Document(); document1.put("_id","2"); document1.put("name","bbbb"); document1.put("age",23); document1.put("bir",new Date()); list.add(document); list.add(document1); t_user.insertMany(list); } /** * 删除一条数据 */ @Test public void testDelete(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> t_user = database.getCollection("t_user"); Document document = new Document(); document.put("_id",1); t_user.deleteOne(document); } /** * 删除多个数据 */ @Test public void testDeleteMany(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> t_user = database.getCollection("t_user"); Document document = new Document(); document.put("name","ccc"); t_user.deleteMany(document); } /** * 查询总条数 * */ @Test public void tesCount(){ MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> t_user = database.getCollection("t_user"); System.out.println(t_user.count()); } @After public void after(){ mongoClient.close(); } } 6.2 实战二:Springboot操作mongoDB 1. Springboot操作mongoDB代码演示,如下所示↓: ⑴ 第一:实验springboot集成mongoDB 依赖引入: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservice_parent</artifactId> <groupId>com.linzk</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot_mongoDBclient</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- mongodb 与 java连接的依赖 --> <!-- <dependency>--> <!-- <groupId>org.mongodb</groupId>--> <!-- <artifactId>mongo-java-driver</artifactId>--> <!-- <version>3.0.0</version>--> <!-- </dependency>--> <!-- 引入springboot-mongodb的依赖 此依赖的底层已经自动引入了上面的(mongo-java-driver依赖),因此不需要在重复引入"mongo与java连接的依赖包" --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies> </project> ⑵ 第二:创建三个对象类 ? Order实体类 @Document(collection="t_order") public class Order { @Id @Indexed //此注解用来创建索引 private Object id; @Field("order_ num") //此注解表示:指定orderNum在集合中的名字为"order_num" private String orderNum; private Date createDate; // 映射忽略的字段,该字段不会保存到mongodb。 @Transient private String cc; //Get和Set方法,toString()方法。 } ? Person 实体类 @Document(collection="t_person") public class Person { @Id // 主键类型只能为:String,ObjectId,BigInteger private String id; private String name; private int age; private double salary; /** * @DBRef //此注解:表示此orders 是一个关系属性。 * 加上此注解的好处:日后你查询Person对象的值时,可以直接将Order对象数据 * 直接查询出来。同时在保存Person数据时,将Order信息也保存进去。 */ //一个Person有多个订单。一般我们都是通过:"一的一方去查询多的一方" @DBRef private List<Order> orders = null; ? User实体类 /** * 若打算将此User对象存储到'MongoDB'中,我们必须让User对象 * 实现序列化接口 */ @Data @Document(collection = "t_user") //设置存储到集合中数据的名称 public class User implements Serializable { @Id //指定将当前的'id'去映射'_id' private String id; private String name; private Integer age; @Transient //此注解表示:在对象进行序列化时,当前这个属性不参与对象序列化 private Date bir; } ? application.yml 配置文件配置: spring: data: mongodb: database: ems #指定连接的mongoDB下的数据库名 uri: mongodb://192.168.35.163:27017 #指定连接mongodb所在的服务器IP地址和端口号 ⑶ 第三:在测试包'test'下使用直接调用"MongoTemplate 模板类"操作mongoDB即可 ? springboot操作mongodb演示一: /** * K */ @SpringBootTest(classes = SpringBootMongoDBApplication.class) @RunWith(SpringRunner.class) public class SpringbootTestMongoDBTemplate { @Autowired private MongoTemplate mongoTemplate; /* 简单演示往mongodb添加数据 */ @Test public void testSave() { User user = new User(); user.setId(UUID.randomUUID().toString()); user.setName("诸葛青"); user.setAge(23); user.setBir(new Date()); mongoTemplate.save(user); } } ?springboot操作mongodb演示二: @SpringBootTest(classes = SpringBootMongoDBApplication.class) @RunWith(SpringRunner.class) public class TestMain01 { @Autowired private MongoTemplate temp; @Test public void test09() { Person person = temp.findById("1001", Person.class); System.out.println(person); List<Order> orderList = person.getOrders(); System.out.println(orderList); for (Order order : orderList) { //遍历打印输出订单信息 System.out.println(order); } } //根据主键id查询 @Test public void test08() { Person person = temp.findById("1001", Person.class); System.out.println(person.getOrders()); } //测试有级联关系的两个对象 @Test public void test06() { Person p = new Person("1001", "zhangsan", 23, 111111); List<Order> list = new ArrayList<Order>(); for (int i = 0; i < 3; i++) { ObjectId objectId = new ObjectId(new Date()); Order order = new Order(objectId, 111111 + "_" + i, new Date()); temp.save(order); list.add(order); p.setOrders(list); ; temp.save(p); } } //删除数据 @Test public void test05() { Person s = new Person(); s.setId(1 + ""); temp.remove(s); } //查询person表中的所有数据 @Test public void test03() { List<Person> list = temp.findAll(Person.class); for (Person s : list) { System.out.println(s); } } //添加数据 @Test public void test02() { /* for(int i = 0 ; i< 5;i++) { Student s = new Student(10+i+"", "zhangsan"+i, 12*i, 2000+i); temp.save(s); } */ //主键如果存在,进行更新 /* Student s = new Student ("2","zhangsan",111,2000); temp.save(s); */ /* insert方法:如果key存在,报错 */ Person s = new Person("2","aa", 100, 2000); temp.insert(s); } //查询所有的库 @Test public void test01() { /* List<String> list = mongo.getDatabaseNames(); for (String dbName : list) { System.out.printIn(dbName) ; } */ } } 7. 阶段小结

以上主要对mongodb的基本介绍和集成java的使用做一个简单介绍。后续对于mongodb的’主从复制,副本集和分片’待更新中…


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #JAVA #集成mongo #1mongoDB引言11 #mongo概述1 #mongodb