mongoDB:阶段一(引言,分布式集群概念,命令,Java集成mongoDB)

前言

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

前言

本章节主要讲解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 1013 09:37 mongodb-linux-x86_64-4.0.13
    -rw-r--r--. 1 root root 85223276 1013 09:34 mongodb-linux-x86_64-4.0.13.tgz
    drwxr-xr-x. 2 root root      211 1013 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})01参数说明:  
    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的’主从复制,副本集和分片’待更新中…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值