参考视频

① MongoDB简介

简介

  • MongoDB是为快速开发互联网Web应用而设计的数据库系统
  • MongoDB的设计目标是极简、灵活、 作为Web应用栈的一部分
  • MongoDB是No SQL数据库
  • MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构。简单理解MongoDB这个数据库存的是各种各样的JSON。(BSON:二进制的JSON

三个概念

  • 数据库(database):是一个仓库,在仓库中可以存放集合。多个文档组成集合,多个集合组成数据库
  • 集合(collection):类似于数组,在集合中可以存放文档。集合就是一组文档,也就是集合是用来存放文 档的 – 集合中存储的文档可以是各种各样的,没有格式要求。
  • 文档(document):文档是数据库中的最小单位,我们存储和操作的内容都是文档。类似于JS中的对象,在MongoDB中每一条数 据都是一个文档
    • 一个文档的属性也可以是一个文档,那么这个文档叫做内嵌文档

② MongoDB的安装

下载安装,命令行启动,每次都要手动启动

  • 进入官网下载地址进行下载,选择相应的版本、系统、下载模式。其中版本6.0.2的第二位是偶数表示稳定版,奇数表示开发版

  • 绿色解压直接使用

  • 配置环境变量到bin目录

    C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\bin

  • 启动方式一:命令行参数方式启服务

    # 进入到bin目录,然后打开cmd,在bin目录统计建一个data文件夹再建一个db文件夹存储数据库数据
    mongod --dbpath=..\data\dbmongod --dbpath 数据库路径 --port 端口号
    
  • 启动方式二:配置文件方式启动

    在解压目录下新建conf文件夹,该文件夹下新建mongod.conf配置文件,内容如下

    storage:dbPath: C:\cvzhanshi\environment\mongodb-win32-x86_64-windows-6.0.2\data\db
    

    启动命令

    mongod -f ../conf/mongod.conf
    或
    mongod --config ../conf/mongod.conf
    
  • 打开客户端就是新打开一个cmd 使用命令mongo

将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动

  • 在安装目录创建data文件夹,在data下创建db和log文件夹

  • 创建配置文件,在bin目录同级创建配置文件mongod.cfg

    systemLog:destination: filepath: C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\log
    storage:dbPath: C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\db
    
  • 以管理员的身份打开命令行窗口

  • 执行如下的命令

    mongod --dbpath "C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\db" --logpath "C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\log\mongod.log" -install -serviceName "MongoDB"
    
  • 查看服务,进行启动

③MongoDB的基本使用

3.1 基本指令

命令 作用
show dbs
show databases
显示当前的所有数据库
use 数据库名 进入到指定的数据库中,进入的不用是存在的数据库,也可以进入不存在的,当插入第一条数据是创建数据库
db db表示的是当前所处的数据库
show collections 显示数据库中所有的集合
db.<collection>.insert(doc) 向集合中插入一个文档
向test数据库中的,stus集合中插入一个新的学生对象{name:“cvzhanshi”,age:18,gender:“男”}
db.stus.insert({name:“cvzhanshi”,age:18,gender:“男”})
db.<collection>.find() 查询当前集合中的所有的文档

3.2 插入操作

命令 作用 说明
db.<collection>.insert() 向集合中插入一个或多个文档 是对后面两个命令的集合
db.collection.insertOne() 向集合中插入一个文档
db.collection.insertMany() 插入多个文档对象
db.stus.insert({name:"猪八戒",age:28,gender:"男"});db.stus.insert([{name:"沙和尚",age:38,gender:"男"},{name:"白骨精",age:16,gender:"女"},{name:"蜘蛛精",age:14,gender:"女"}
]);
  • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id该属性用来作为文档的唯一标识
  • id我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定_id 也必须确保它的唯一性
db.stus.insert({_id:"hello",name:"猪八戒",age:28,gender:"男"});

3.3 查询操作

命令 作用 说明
db.collection.find() find()用来查询集合中所有符合条件的文档
find()返回的是一个数组
find()可以接收一个对象作为条件参数
{} 表示查询集合中所有的文档
{属性:值} 查询属性是指定值的文档
db.collection.findOne() 用来查询集合中符合条件的第一个文档
findOne()返回的是一个文档对象
db.collection.find({}).count() 查询所有符合条件结果的数量
db.stus.find({_id:"hello"});
db.stus.find({age:16 , name:"白骨精"});
db.stus.find({age:28});
db.stus.findOne({age:28});
db.stus.find({}).count();
  • MongoDB支持持节内嵌文档的属性值查询,如果要查询内嵌文档则可以通过 . 的形式来匹配

  • 如果要通过内嵌文档来对文档进行查询,此时属性名必须加上引号

    db.collection.find({"hobby.movies":"hero"});
    

3.4 修改操作

命令 作用 说明
db.collection.update(查询条件,新对象) update()默认情况下会使用新对象来替换旧的对象
update()默认只会修改一个
如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
$set 可以用来修改文档中的指定属性
unset可以用来删除文档的指定属性<br/>unset 可以用来删除文档的指定属性<br />unset可以用来删除文档的指定属性<br/>push 用于向数组添加一个元素,可以重复
$addToSet 向数组中添加一个新元素,不重复的
db.collection.updateMany() 同时修改多个符合条件的文档
db.collection.updateOne() 修改一个符合条件的文档
db.collection.replaceOne() 替换一个文档
// 新对象直接替换
db.stus.update({name:"沙和尚"},{age:28});// 修改
db.stus.update({"_id" : ObjectId("59c219689410bc1dbecc0709")},{$set:{gender:"男",address:"流沙河"}}
)// 删除指定属性
db.stus.update({"_id" : ObjectId("59c219689410bc1dbecc0709")},{$unset:{address:1}}
)// 修改所有满足条件的文档
db.stus.updateMany({"name" : "猪八戒"},{$set:{address:"猪老庄"}}
);// 使用multi属性是update修改多个
db.stus.update({"name" : "猪八戒"},{$set:{address:"呵呵呵"}}  ,{multi:true}
)

3.5 删除操作

命令 作用 说明
db.collection.remove() 删除满足条件的集合一个或多个; 删除一个或多个,可以第二个参数传递一个true,则只会删除一个
如果传递一个空对象作为参数,则会删除所有的
db.collection.deleteOne() 删除满足条件的一个集合
db.collection.deleteMany() 删除满足条件的多个集合
db.collection.drop() 删除集合
db.dropDatabase() 删除数据库

3.6 练习

//1.进入my_test数据库
use my_test;//2.向数据库的user集合中插入一个文档
db.user.insert({username: "cvzhanshi"
});//3.查询user集合中的文档
db.user.find();//4.向数据库的user集合中插入一个文档
db.user.insert({username:"ursula"
});//5.查询数据库user集合中的文档
db.user.find();//6.统计数据库user集合中的文档数量
db.user.find().count();//7.查询数据库user集合中username为cvzhanshi的文档
db.user.find({username:"cvzhanshi"
});//8.向数据库user集合中的username为cvzhanshi的文档,添加一个address属性,属性值为huaguoshan
db.user.update({username:"cvzhanshi"}, {$set:{address:"huaguoshan"}});//9.使用{username:"tangseng"} 替换 username 为 ursula的文档
db.user.replaceOne({username:"ursula"}, {username:"tangseng"})//10.删除username为cvzhanshi的文档的address属性
db.user.update({username:"cvzhanshi"}, {$unset:{address:1}});//11.向username为cvzhanshi的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
//MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
db.user.update({username:"cvzhanshi"}, {$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});
db.user.find();//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
db.user.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}});//13.查询喜欢电影hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
//如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
// find是可以查询数组里面是否包含的
db.user.find({'hobby.movies':"hero"});//14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素
//$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}});//15.删除喜欢Interstellar的用户
db.user.remove({"hobby.movies":"Interstellar"
});
db.user.find();//16.删除user集合
db.user.drop();//17.向numbers中插入20000条数据 7.2sfor(var i=1 ; i<=20000 ; i++){db.numbers.insert({num:i});
}db.numbers.find()db.numbers.remove({});//0.4s
var arr = [];for(var i=1 ; i<=20000 ; i++){arr.push({num:i});
}db.numbers.insert(arr);
//18.查询numbers中num为500的文档
db.numbers.find({num:500})
db.numbers.find({num:{$eq:500}});//19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});//20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}});//21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40 , $lt:50}});//22.查询numbers中num大于19996的文档
db.numbers.find({num:{$gt:19996}});//23.查看numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});
//limit()设置显示数据的上限
db.numbers.find().limit(10);//24.查看numbers集合中的第11条到20条数据
/*分页 每页显示10条1-10     011-20    1021-30    20。。。skip((页码-1) * 每页显示的条数).limit(每页显示的条数);skip()用于跳过指定数量的数据    MongoDB会自动调整skip和limit的位置
*/
db.numbers.find().skip(10).limit(10);//25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10);//26.将dept和emp集合导入到数据库中
db.dept.insert([{"_id" : ObjectId("5941f2bac1bc86928f4de49a"),"deptno" : 10.0,"dname" : "财务部","loc" : "北京"
},
{"_id" : ObjectId("5941f2bac1bc86928f4de49b"),"deptno" : 20.0,"dname" : "办公室","loc" : "上海"
},
{"_id" : ObjectId("5941f2bac1bc86928f4de49c"),"deptno" : 30.0,"dname" : "销售部","loc" : "广州"
},
{"_id" : ObjectId("5941f2bac1bc86928f4de49d"),"deptno" : 40.0,"dname" : "运营部","loc" : "深圳"
}]);db.emp.insert([{"_id" : ObjectId("5941f5bfc1bc86928f4de4ac"),"empno" : 7369.0,"ename" : "林冲","job" : "职员","mgr" : 7902.0,"hiredate" : ISODate("1980-12-16T16:00:00Z"),"sal" : 800.0,"depno" : 20.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4ad"),"empno" : 7499.0,"ename" : "孙二娘","job" : "销售","mgr" : 7698.0,"hiredate" : ISODate("1981-02-19T16:00:00Z"),"sal" : 1600.0,"comm" : 300.0,"depno" : 30.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4ae"),"empno" : 7521.0,"ename" : "扈三娘","job" : "销售","mgr" : 7698.0,"hiredate" : ISODate("1981-02-21T16:00:00Z"),"sal" : 1250.0,"comm" : 500.0,"depno" : 30.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4af"),"empno" : 7566.0,"ename" : "卢俊义","job" : "经理","mgr" : 7839.0,"hiredate" : ISODate("1981-04-01T16:00:00Z"),"sal" : 2975.0,"depno" : 20.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b0"),"empno" : 7654.0,"ename" : "潘金莲","job" : "销售","mgr" : 7698.0,"hiredate" : ISODate("1981-09-27T16:00:00Z"),"sal" : 1250.0,"comm" : 1400.0,"depno" : 30.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b1"),"empno" : 7698.0,"ename" : "西门庆","job" : "经理","mgr" : 7839.0,"hiredate" : ISODate("1981-04-30T16:00:00Z"),"sal" : 2850.0,"depno" : 30.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b2"),"empno" : 7782.0,"ename" : "柴进","job" : "经理","mgr" : 7839.0,"hiredate" : ISODate("1981-06-08T16:00:00Z"),"sal" : 2450.0,"depno" : 10.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b3"),"empno" : 7788.0,"ename" : "公孙胜","job" : "分析师","mgr" : 7566.0,"hiredate" : ISODate("1987-07-12T16:00:00Z"),"sal" : 3000.0,"depno" : 20.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b4"),"empno" : 7839.0,"ename" : "宋江","job" : "董事长","hiredate" : ISODate("1981-11-16T16:00:00Z"),"sal" : 5000.0,"depno" : 10.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b5"),"empno" : 7844.0,"ename" : "阎婆惜","job" : "销售","mgr" : 7698.0,"hiredate" : ISODate("1981-09-07T16:00:00Z"),"sal" : 1500.0,"comm" : 0.0,"depno" : 30.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b6"),"empno" : 7876.0,"ename" : "李逵","job" : "职员","mgr" : 7902.0,"hiredate" : ISODate("1987-07-12T16:00:00Z"),"sal" : 1100.0,"depno" : 20.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b7"),"empno" : 7900.0,"ename" : "武松","job" : "职员","mgr" : 7782.0,"hiredate" : ISODate("1981-12-02T16:00:00Z"),"sal" : 950.0,"depno" : 10.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b8"),"empno" : 7902.0,"ename" : "吴用","job" : "分析师","mgr" : 7566.0,"hiredate" : ISODate("1981-12-02T16:00:00Z"),"sal" : 3000.0,"depno" : 20.0
},
{"_id" : ObjectId("5941f5bfc1bc86928f4de4b9"),"empno" : 7934.0,"ename" : "鲁智深","job" : "职员","mgr" : 7782.0,"hiredate" : ISODate("1982-01-22T16:00:00Z"),"sal" : 1300.0,"depno" : 10.0
}]);
db.dept.find()
db.emp.find()//27.查询工资小于2000的员工
db.emp.find({sal:{$lt:2000}});//28.查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000 , $gt:1000}});//29.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});//30.查询财务部的所有员工
var depno = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno:depno});//31.查询销售部的所有员工
var depno = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno:depno});//32.查询所有mgr为7698的所有员工
db.emp.find({mgr:7698})//33.为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});
db.emp.find()

3.7 sort和投影

sort

  • 查询文档时,默认情况是按照_id的值进行排列(升序)
  • sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
  • limit skip sort 可以以任意的顺序进行调用
// 先按照工资升序排序,后面按照部门编号降序排序
db.emp.find({}).sort({sal:1,empno:-1});

投影

在查询时,可以在第二个参数的位置来设置查询结果的 投影

db.emp.find({},{ename:1 , _id:0 , sal:1});

④ 文档之间的关系

一对一(one to one)

  • 夫妻 (一个丈夫 对应 一个妻子)
  • 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
db.wifeAndHusband.insert([{name:"黄蓉",husband:{name:"郭靖"}},{name:"潘金莲",husband:{name:"武大郎"}}]);
db.wifeAndHusband.find();

一对多(one to many)/多对一(many to one)

  • 父母 - 孩子
  • 用户 - 订单
  • 文章 - 评论

也可以通过内嵌文档来映射一对多的关系

//一对多 用户(users) 和 订单(orders)
db.users.insert([{username:"swk"},{username:"zbj"
}]);db.order.insert({list:["牛肉","漫画"],user_id: ObjectId("59c47e35241d8d36a1d50de0")});db.users.find()
db.order.find()//查找用户swk的订单
var user_id = db.users.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});

多对多(many to many)

  • 分类 - 商品
  • 老师 - 学生
//多对多
db.teachers.insert([{name:"洪七公"},{name:"黄药师"},{name:"龟仙人"}
]);db.stus.insert([{name:"郭靖",tech_ids:[ObjectId("59c4806d241d8d36a1d50de4"),ObjectId("59c4806d241d8d36a1d50de5")]},{name:"孙悟空",tech_ids:[ObjectId("59c4806d241d8d36a1d50de4"),ObjectId("59c4806d241d8d36a1d50de5"),ObjectId("59c4806d241d8d36a1d50de6")]}
])

⑤ Spring Boot整合MongoDB

spring-data-mongodb提供了两种方式访问mongodb:

(1)MongoTemplate

(2)MongoRepository

MongoRepository操作简单,MongoTemplate操作灵活

  • 创建spring boot项目

  • 导入依赖

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.cvzhanshi</groupId><artifactId>mongodb</artifactId><version>0.0.1-SNAPSHOT</version><name>mongodb</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- 引入lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency><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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
    </project>
    
  • 编写配置文件

    spring:data:mongodb:host: localhostport: 27017# 数据库不一定要事先创建好database: mongodb_demo
    
  • 创建实体类

    /*** @author cVzhanshi* @create 2022-10-26 19:14*/
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    // 对应Collection名
    @Document("user")
    public class User {@Idprivate String id;private String name;private Integer age;private String email;private Date createDate;
    }
    

5.1 MongoRepository测试

MongoRepository的生成规则

方法关键字 示例 等价于SQL
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1(参数绑定附加%)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1(参数与预先绑定%)
Containing findByFirstnameContaining … where x.firstname like ?1(参数绑定%)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection ages) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

5.1.1 插入操作

@Test
void addOneUserForRepo() {User user = new User().setAge(221).setName("user").setEmail("cvzhanshi@qq.com").setCreateDate(DateUtil.date());// save方法既可以添加也可以修改,取决于user中有没有id//        userRepository.save(user);userRepository.insert(user);
}

5.1.2 修改操作

@Test
void updateUserForRepo() {User user = userRepository.findById("635921e925015871927c1d09").get();user.setName("1111");user.setAge(26);User save = userRepository.save(user);System.out.println(save);
}

5.1.3 删除操作

@Test
void deleteByIdUserForRepo() {userRepository.deleteById("635921e925015871927c1d09");
}

5.1.4 查询操作

@Test
void queryUserForRepo() {/*** 根据id查询*/User user = userRepository.findById("635921e925015871927c1d09").get();System.out.println(user);/*** 查询所有*/userRepository.findAll().forEach(System.out::println);/*** 查询所有并排序*/Sort sort = Sort.by(Sort.Direction.DESC, "age");userRepository.findAll(sort).forEach(System.out::println);/*** 条件查询*/Example<User> userExample = Example.of(new User().setName("cvzhanshi1121"));userRepository.findAll(userExample).forEach(System.out::println);/*** 分页查询*///page=0表示第一页PageRequest pageable = PageRequest.of(0, 2);Page<User> all = userRepository.findAll(pageable);List<User> userList = all.getContent();userList.forEach(u -> {System.out.println(u);});long totalElements = all.getTotalElements();//总记录数int totalPages = all.getTotalPages();//总页数System.out.println("总记录数:"+ totalElements);System.out.println("总页数:"+ totalPages);}@Test
void pageSortQueryUser(){/*** 分页查询并排序*/Sort sort = Sort.by(Sort.Direction.DESC, "age");//page=0表示第一页PageRequest pageable = PageRequest.of(0, 2,sort);Page<User> all = userRepository.findAll(pageable);List<User> userList = all.getContent();userList.forEach(u -> {System.out.println(u);});long totalElements = all.getTotalElements();//总记录数int totalPages = all.getTotalPages();//总页数System.out.println("总记录数:"+ totalElements);System.out.println("总页数:"+ totalPages);
}@Test
void queryLikeForRepoUser(){/*** 分页查询并排序*/User user = new User();user.setName("cvzhanshi1121");//模糊查询固定格式ExampleMatcher matcher =ExampleMatcher.matching().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//模糊查询.withIgnoreCase(true); //忽略大小写Example<User> example =  Example.of(user,matcher);List<User> userList = userRepository.findAll(example);userList.forEach(System.out::println);
}@Test
void queryLikePageSortForRepoUser(){/*** 分页排序加模糊查询*/Sort sort = Sort.by(Sort.Direction.DESC, "age");//page=0表示第一页PageRequest pageable = PageRequest.of(0, 4,sort);//模糊查询ExampleMatcher matcher = ExampleMatcher.matching().withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING).withIgnoreCase(true);User user = new User();user.setName("est");Example<User> example = Example.of(user, matcher);Page<User> pages = userRepository.findAll(example, pageable);List<User> userList = pages.getContent();userList.forEach(System.out::println);}

5.2 MongoTemplate测试

MongoTemplate常用的方法

方法 作用
mongoTemplate.findAll(User.class) 查询User文档的全部数据
mongoTemplate.findById(<id>, User.class) 查询User文档id为id的数据
mongoTemplate.find(query, User.class) 根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class) 根据query内的查询条件修改
mongoTemplate.remove(query, User.class) 根据query内的查询条件删除
mongoTemplate.insert(User) 新增文档

Query对象

  • 创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)

  • 精准条件:criteria.and(“key”).is(“条件”)

    模糊条件:criteria.and(“key”).regex(“条件”)

  • 封装条件:query.addCriteria(criteria)

  • 大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)

    小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)

  • Query.addCriteria(new Criteria().andOperator(gt,lt));

  • 一个query中只能有一个andOperator()。其参数也可以是Criteria数组。

  • 排序 :query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))

Criteria关键字解释

关键字 解释
eq 等于,第一个参数是对象属性,第二个参数是值
allEq 参数为一个Map对象,相当于多个eq的叠加
gt 大于
ge 大于等于
lt 小于
le 小于等于
between 在两个值之间Expression.between(“age”,new Integer(10),new Integer(20));
like like查询
in in查询

测试类

@SpringBootTest
class MongodbApplicationTests {@Autowiredprivate MongoTemplate mongoTemplate;
}

5.2.1 插入操作

// 插入一条记录
@Test
void addOneUser() {User user = new User().setAge(22).setName("cvzhanshi").setEmail("cvzhanshi@qq.com").setCreateDate(DateUtil.date());mongoTemplate.insert(user);
}
// 插入多条记录
@Test
void addManyUser() {ArrayList<User> users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User().setAge(22).setName("cvzhanshi").setEmail("cvzhanshi@qq.com").setCreateDate(DateUtil.date());users.add(user);}// 第一个参数,要插入的集合// 第二个参数,collectionNmaemongoTemplate.insert(users,"user");
}

5.2.2 修改操作

updateMulti 修改

@Test
void updateMultiUser() {// 修改的条件Query query = new Query(Criteria.where("name").is("cvzhanshi"));// 修改的属性及其要修改的值Update update = new Update();update.set("name","cvzhanshi111");update.set("age",11);// 修改满足条件的所有文档UpdateResult result = mongoTemplate.updateMulti(query, update, "user");
}

save修改

@Test
void updateSaveUser() {User user = mongoTemplate.findById("63591941ae0958363215b15f", User.class);user.setName("testsave");// user有id  save()执行修改指定文档   无id  执行新增操作mongoTemplate.save(user);
}

5.2.3 删除操作

remove带条件删除

@Test
void removeUser() {Query query = new Query(Criteria.where("_id").is("63591941ae0958363215b15f"));mongoTemplate.remove(query, "user");
}

5.2.4 查询操作

@Test
void queryUser() {/*** 查询全部*/List<User> users = mongoTemplate.findAll(User.class);users.forEach(System.out::println);/*** 根据id查询*/User user = mongoTemplate.findById("63591941ae0958363215b15f", User.class);System.out.println(user);/*** 根据条件查询*/Query query = new Query();//is方法的参数类型object,但是实际传入的值一定和字段本身的类型要一致query.addCriteria(Criteria.where("name").is("cvzhanshi1121"));List<User> userList = mongoTemplate.find(query, User.class);userList.forEach(System.out::println);/*** 分页查询/带条件分页查询*/Query query1 = new Query(Criteria.where("age").is(11)).skip(0).limit(3);List<User> userList2 = mongoTemplate.find(query1, User.class);userList2.forEach(u -> {System.out.println(u);});}@Test
void queryLikeUser() {/*** 模糊查询*/String name = "1";//这几行固定格式的,实现模糊查询String regex = String.format("%s%s%s", "^.*", name, ".*$");Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Query query = new Query(Criteria.where("name").regex(pattern));List<User> userList = mongoTemplate.find(query, User.class);userList.forEach(System.out::println);
}

MongoDB简单入门篇及其Spring Boot整合相关推荐

  1. 【任务篇】Spring Boot 整合 XXL-JOB 实现定时任务

    写在最前 之前介绍过[任务篇]Spring Boot 内置定时任务 Spring Task 实现定时任务,这次介绍 XXL-JOB 实现定时任务. XXL-JOB XXL-JOB 是一个分布式任务调度 ...

  2. 第四篇:Spring Boot 整合listener

    一.Spring Boot整合listener 第一种方案:通过注解扫描完成Listener的注册 1.1 编写一个listener @WebListener public class FirstLi ...

  3. 第十篇:Spring Boot整合mybatis+Mysql 入门试炼02

    前言: 1.(SprigBoot整合SpringMVC+Mybatis) 2.以thymeleaf作为视图层技术整合 3.springboot版本2.0.5.RELEASE 创建项目 1.添加依赖及启 ...

  4. 第十篇:Spring Boot整合mybatis+逆向工程(Mysql+Oracle) 入门试炼01

    1.添加pom依赖 <dependencies><!--springboot web 启动器--><dependency><groupId>org.sp ...

  5. 第三篇:Spring Boot整合Servlet

    一.Springboot整合Servlet 第一种方案: 1.创建一个自定义的servlet,继承HttpServlet添加@WebServlet注解 以前ssm中的web.xml配置文件中的serv ...

  6. 第九篇:Spring Boot整合Spring Data JPA_入门试炼01

    Spring Data JPA:介绍: Spring Data就是spring提供操作数据库的框架,而Spring Data JPA只是Spring Data框架下的一个基于JPA标准操作数据库的模块 ...

  7. 第八篇:Spring Boot整合Thymeleaf_入门试炼04

    继承parent父工程,新建一个子项目,名称为spring-boot-chapter-8 1.引入 thymeleaf 模板依赖 <!-- 引入 thymeleaf 模板依赖 -->< ...

  8. 第七篇:Spring Boot 整合_Thymeleaf 入门试炼 QuickStart

    1.1 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId> ...

  9. 第九篇:Spring Boot整合Spring Data JPA_入门试炼02

    Spring Data JPA 提供的核心接口 1.Repository接口 2.CrudRepository接口 3.PagingAndSortingRepository接口 4.JpaReposi ...

最新文章

  1. 为什么 CPU 访问硬盘很慢?
  2. 2 模版_轻量html模版渲染库 cJinja
  3. 华为-yolo系列详解
  4. SaaS业务的价值评估
  5. 如何阻止ajax自动重定向_重发和重定向有什么区别与重定向应用
  6. SQL注入问题及预防方法
  7. 贵州2021高考状元成绩查询,2021年贵州高考状元名单公布,贵州高考状元学校资料及最高分...
  8. ISOLINUX: A bootloader for Linux using ISO 9660/El Torito CD-ROMs
  9. SAP License:Query传输的相关操作
  10. AIO、NIO、BIO
  11. JAVA关键字及作用
  12. Android支付实践(一)之支付宝支付详解与demo
  13. 自己整理的90分以上最新物联网技术导论期末选择填空大题总考点
  14. matlab系统数学模型建立,第五章 matlabsimulink下数学模型的建立
  15. 服务器虚拟机系统镜像安装win7系统,在虚拟机中怎么安装Win7旗舰版系统
  16. excel 瀵煎叆mysql_hypermesh瀵煎叆ansys
  17. html+css唯美登录页面,代码提供(效果展示)
  18. java 中vo、po、dto、bo、pojo、entity、mode如何区分
  19. 使用TWRP Recovery刷入CM13等第三方ROM教程
  20. 11.3 树的遍历:LDR,LRD,VLR 相关代码

热门文章

  1. [生存志] 第65节 曾参公西赤
  2. ios 第三方键盘开发 无限刷屏浅析
  3. 为什么离开以前的公司
  4. 天才程序员:我不是一个好的示范
  5. 计算机试题dddd,2016年计算机一级考试操作题题库
  6. log4c日志库的用法,再封装及其完整例子
  7. 船舶电子电气工程专业出来的交响_船舶电子电气工程专业
  8. mysql子查询走索引吗_MySQL中in子查询会导致无法使用索引问题(转)
  9. android的contentprovider多媒体,Android利用ContentProvider获取本地数据的方法
  10. Discuz!应用中心安装插件显示数据下载错误(105/102)的解决方法