MongoDB简单入门篇及其Spring Boot整合

港控/mmm° 2023-09-24 13:43 138阅读 0赞

参考视频

① 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

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

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

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

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

    启动命令

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

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

  • 在安装目录创建data文件夹,在data下创建db和log文件夹
  • 创建配置文件,在bin目录同级创建配置文件mongod.cfg

    1. systemLog:
    2. destination: file
    3. path: C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\log
    4. storage:
    5. dbPath: C:\cvzhanshi\environment\mongodb-win32-x86_64-2008plus-ssl-4.0.28\data\db
  • 以管理员的身份打开命令行窗口
  • 执行如下的命令

    1. 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() 插入多个文档对象
  1. db.stus.insert({
  2. name:"猪八戒",age:28,gender:"男"});
  3. db.stus.insert([
  4. {
  5. name:"沙和尚",age:38,gender:"男"},
  6. {
  7. name:"白骨精",age:16,gender:"女"},
  8. {
  9. name:"蜘蛛精",age:14,gender:"女"}
  10. ]);
  • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id该属性用来作为文档的唯一标识
  • id我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定_id 也必须确保它的唯一性

    db.stus.insert({

    1. _id:"hello",name:"猪八戒",age:28,gender:"男"});

3.3 查询操作


























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

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

3.4 修改操作































命令 作用 说明
db.collection.update(查询条件,新对象) update()默认情况下会使用新对象来替换旧的对象
update()默认只会修改一个
如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
$set 可以用来修改文档中的指定属性
u n s e t 可以用来删除文档的指定属性 < b r / > unset 可以用来删除文档的指定属性<br /> unset可以用来删除文档的指定属性<br/>push 用于向数组添加一个元素,可以重复
$addToSet 向数组中添加一个新元素,不重复的
db.collection.updateMany() 同时修改多个符合条件的文档
db.collection.updateOne() 修改一个符合条件的文档
db.collection.replaceOne() 替换一个文档
  1. // 新对象直接替换
  2. db.stus.update({
  3. name:"沙和尚"},{
  4. age:28});
  5. // 修改
  6. db.stus.update(
  7. {
  8. "_id" : ObjectId("59c219689410bc1dbecc0709")},
  9. {
  10. $set:{
  11. gender:"男",
  12. address:"流沙河"
  13. }}
  14. )
  15. // 删除指定属性
  16. db.stus.update(
  17. {
  18. "_id" : ObjectId("59c219689410bc1dbecc0709")},
  19. {
  20. $unset:{
  21. address:1
  22. }}
  23. )
  24. // 修改所有满足条件的文档
  25. db.stus.updateMany(
  26. {
  27. "name" : "猪八戒"},
  28. {
  29. $set:{
  30. address:"猪老庄"
  31. }
  32. }
  33. );
  34. // 使用multi属性是update修改多个
  35. db.stus.update(
  36. {
  37. "name" : "猪八戒"},
  38. {
  39. $set:{
  40. address:"呵呵呵"
  41. }
  42. } ,
  43. {
  44. multi:true
  45. }
  46. )

3.5 删除操作




































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

3.6 练习

  1. //1.进入my_test数据库
  2. use my_test;
  3. //2.向数据库的user集合中插入一个文档
  4. db.user.insert({
  5. username: "cvzhanshi"
  6. });
  7. //3.查询user集合中的文档
  8. db.user.find();
  9. //4.向数据库的user集合中插入一个文档
  10. db.user.insert({
  11. username:"ursula"
  12. });
  13. //5.查询数据库user集合中的文档
  14. db.user.find();
  15. //6.统计数据库user集合中的文档数量
  16. db.user.find().count();
  17. //7.查询数据库user集合中username为cvzhanshi的文档
  18. db.user.find({
  19. username:"cvzhanshi"
  20. });
  21. //8.向数据库user集合中的username为cvzhanshi的文档,添加一个address属性,属性值为huaguoshan
  22. db.user.update({
  23. username:"cvzhanshi"}, {
  24. $set:{
  25. address:"huaguoshan"}});
  26. //9.使用{username:"tangseng"} 替换 username 为 ursula的文档
  27. db.user.replaceOne({
  28. username:"ursula"}, {
  29. username:"tangseng"})
  30. //10.删除username为cvzhanshi的文档的address属性
  31. db.user.update({
  32. username:"cvzhanshi"}, {
  33. $unset:{
  34. address:1}});
  35. //11.向username为cvzhanshi的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
  36. //MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
  37. db.user.update({
  38. username:"cvzhanshi"}, {
  39. $set:{
  40. hobby:{
  41. cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});
  42. db.user.find();
  43. //12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
  44. db.user.update({
  45. username:"tangseng"},{
  46. $set:{
  47. hobby:{
  48. movies:["A Chinese Odyssey","King of comedy"]}}});
  49. //13.查询喜欢电影hero的文档
  50. //MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
  51. //如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
  52. // find是可以查询数组里面是否包含的
  53. db.user.find({
  54. 'hobby.movies':"hero"});
  55. //14.向tangseng中添加一个新的电影Interstellar
  56. //$push 用于向数组中添加一个新的元素
  57. //$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
  58. db.user.update({
  59. username:"tangseng"},{
  60. $push:{
  61. "hobby.movies":"Interstellar"}});
  62. //15.删除喜欢Interstellar的用户
  63. db.user.remove({
  64. "hobby.movies":"Interstellar"
  65. });
  66. db.user.find();
  67. //16.删除user集合
  68. db.user.drop();
  69. //17.向numbers中插入20000条数据 7.2s
  70. for(var i=1 ; i<=20000 ; i++){
  71. db.numbers.insert({
  72. num:i});
  73. }
  74. db.numbers.find()
  75. db.numbers.remove({
  76. });
  77. //0.4s
  78. var arr = [];
  79. for(var i=1 ; i<=20000 ; i++){
  80. arr.push({
  81. num:i});
  82. }
  83. db.numbers.insert(arr);
  84. //18.查询numbers中num为500的文档
  85. db.numbers.find({
  86. num:500})
  87. db.numbers.find({
  88. num:{
  89. $eq:500}});
  90. //19.查询numbers中num大于5000的文档
  91. db.numbers.find({
  92. num:{
  93. $gt:500}});
  94. //20.查询numbers中num小于30的文档
  95. db.numbers.find({
  96. num:{
  97. $lt:30}});
  98. //21.查询numbers中num大于40小于50的文档
  99. db.numbers.find({
  100. num:{
  101. $gt:40 , $lt:50}});
  102. //22.查询numbers中num大于19996的文档
  103. db.numbers.find({
  104. num:{
  105. $gt:19996}});
  106. //23.查看numbers集合中的前10条数据
  107. db.numbers.find({
  108. num:{
  109. $lte:10}});
  110. //limit()设置显示数据的上限
  111. db.numbers.find().limit(10);
  112. //24.查看numbers集合中的第11条到20条数据
  113. /*
  114. 分页 每页显示10条
  115. 1-10 0
  116. 11-20 10
  117. 21-30 20
  118. 。。。
  119. skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
  120. skip()用于跳过指定数量的数据
  121. MongoDB会自动调整skip和limit的位置
  122. */
  123. db.numbers.find().skip(10).limit(10);
  124. //25.查看numbers集合中的第21条到30条数据
  125. db.numbers.find().skip(20).limit(10);
  126. //26.将dept和emp集合导入到数据库中
  127. db.dept.insert([{
  128. "_id" : ObjectId("5941f2bac1bc86928f4de49a"),
  129. "deptno" : 10.0,
  130. "dname" : "财务部",
  131. "loc" : "北京"
  132. },
  133. {
  134. "_id" : ObjectId("5941f2bac1bc86928f4de49b"),
  135. "deptno" : 20.0,
  136. "dname" : "办公室",
  137. "loc" : "上海"
  138. },
  139. {
  140. "_id" : ObjectId("5941f2bac1bc86928f4de49c"),
  141. "deptno" : 30.0,
  142. "dname" : "销售部",
  143. "loc" : "广州"
  144. },
  145. {
  146. "_id" : ObjectId("5941f2bac1bc86928f4de49d"),
  147. "deptno" : 40.0,
  148. "dname" : "运营部",
  149. "loc" : "深圳"
  150. }]);
  151. db.emp.insert([
  152. {
  153. "_id" : ObjectId("5941f5bfc1bc86928f4de4ac"),
  154. "empno" : 7369.0,
  155. "ename" : "林冲",
  156. "job" : "职员",
  157. "mgr" : 7902.0,
  158. "hiredate" : ISODate("1980-12-16T16:00:00Z"),
  159. "sal" : 800.0,
  160. "depno" : 20.0
  161. },
  162. {
  163. "_id" : ObjectId("5941f5bfc1bc86928f4de4ad"),
  164. "empno" : 7499.0,
  165. "ename" : "孙二娘",
  166. "job" : "销售",
  167. "mgr" : 7698.0,
  168. "hiredate" : ISODate("1981-02-19T16:00:00Z"),
  169. "sal" : 1600.0,
  170. "comm" : 300.0,
  171. "depno" : 30.0
  172. },
  173. {
  174. "_id" : ObjectId("5941f5bfc1bc86928f4de4ae"),
  175. "empno" : 7521.0,
  176. "ename" : "扈三娘",
  177. "job" : "销售",
  178. "mgr" : 7698.0,
  179. "hiredate" : ISODate("1981-02-21T16:00:00Z"),
  180. "sal" : 1250.0,
  181. "comm" : 500.0,
  182. "depno" : 30.0
  183. },
  184. {
  185. "_id" : ObjectId("5941f5bfc1bc86928f4de4af"),
  186. "empno" : 7566.0,
  187. "ename" : "卢俊义",
  188. "job" : "经理",
  189. "mgr" : 7839.0,
  190. "hiredate" : ISODate("1981-04-01T16:00:00Z"),
  191. "sal" : 2975.0,
  192. "depno" : 20.0
  193. },
  194. {
  195. "_id" : ObjectId("5941f5bfc1bc86928f4de4b0"),
  196. "empno" : 7654.0,
  197. "ename" : "潘金莲",
  198. "job" : "销售",
  199. "mgr" : 7698.0,
  200. "hiredate" : ISODate("1981-09-27T16:00:00Z"),
  201. "sal" : 1250.0,
  202. "comm" : 1400.0,
  203. "depno" : 30.0
  204. },
  205. {
  206. "_id" : ObjectId("5941f5bfc1bc86928f4de4b1"),
  207. "empno" : 7698.0,
  208. "ename" : "西门庆",
  209. "job" : "经理",
  210. "mgr" : 7839.0,
  211. "hiredate" : ISODate("1981-04-30T16:00:00Z"),
  212. "sal" : 2850.0,
  213. "depno" : 30.0
  214. },
  215. {
  216. "_id" : ObjectId("5941f5bfc1bc86928f4de4b2"),
  217. "empno" : 7782.0,
  218. "ename" : "柴进",
  219. "job" : "经理",
  220. "mgr" : 7839.0,
  221. "hiredate" : ISODate("1981-06-08T16:00:00Z"),
  222. "sal" : 2450.0,
  223. "depno" : 10.0
  224. },
  225. {
  226. "_id" : ObjectId("5941f5bfc1bc86928f4de4b3"),
  227. "empno" : 7788.0,
  228. "ename" : "公孙胜",
  229. "job" : "分析师",
  230. "mgr" : 7566.0,
  231. "hiredate" : ISODate("1987-07-12T16:00:00Z"),
  232. "sal" : 3000.0,
  233. "depno" : 20.0
  234. },
  235. {
  236. "_id" : ObjectId("5941f5bfc1bc86928f4de4b4"),
  237. "empno" : 7839.0,
  238. "ename" : "宋江",
  239. "job" : "董事长",
  240. "hiredate" : ISODate("1981-11-16T16:00:00Z"),
  241. "sal" : 5000.0,
  242. "depno" : 10.0
  243. },
  244. {
  245. "_id" : ObjectId("5941f5bfc1bc86928f4de4b5"),
  246. "empno" : 7844.0,
  247. "ename" : "阎婆惜",
  248. "job" : "销售",
  249. "mgr" : 7698.0,
  250. "hiredate" : ISODate("1981-09-07T16:00:00Z"),
  251. "sal" : 1500.0,
  252. "comm" : 0.0,
  253. "depno" : 30.0
  254. },
  255. {
  256. "_id" : ObjectId("5941f5bfc1bc86928f4de4b6"),
  257. "empno" : 7876.0,
  258. "ename" : "李逵",
  259. "job" : "职员",
  260. "mgr" : 7902.0,
  261. "hiredate" : ISODate("1987-07-12T16:00:00Z"),
  262. "sal" : 1100.0,
  263. "depno" : 20.0
  264. },
  265. {
  266. "_id" : ObjectId("5941f5bfc1bc86928f4de4b7"),
  267. "empno" : 7900.0,
  268. "ename" : "武松",
  269. "job" : "职员",
  270. "mgr" : 7782.0,
  271. "hiredate" : ISODate("1981-12-02T16:00:00Z"),
  272. "sal" : 950.0,
  273. "depno" : 10.0
  274. },
  275. {
  276. "_id" : ObjectId("5941f5bfc1bc86928f4de4b8"),
  277. "empno" : 7902.0,
  278. "ename" : "吴用",
  279. "job" : "分析师",
  280. "mgr" : 7566.0,
  281. "hiredate" : ISODate("1981-12-02T16:00:00Z"),
  282. "sal" : 3000.0,
  283. "depno" : 20.0
  284. },
  285. {
  286. "_id" : ObjectId("5941f5bfc1bc86928f4de4b9"),
  287. "empno" : 7934.0,
  288. "ename" : "鲁智深",
  289. "job" : "职员",
  290. "mgr" : 7782.0,
  291. "hiredate" : ISODate("1982-01-22T16:00:00Z"),
  292. "sal" : 1300.0,
  293. "depno" : 10.0
  294. }]);
  295. db.dept.find()
  296. db.emp.find()
  297. //27.查询工资小于2000的员工
  298. db.emp.find({
  299. sal:{
  300. $lt:2000}});
  301. //28.查询工资在1000-2000之间的员工
  302. db.emp.find({
  303. sal:{
  304. $lt:2000 , $gt:1000}});
  305. //29.查询工资小于1000或大于2500的员工
  306. db.emp.find({
  307. $or:[{
  308. sal:{
  309. $lt:1000}} , {
  310. sal:{
  311. $gt:2500}}]});
  312. //30.查询财务部的所有员工
  313. var depno = db.dept.findOne({
  314. dname:"财务部"}).deptno;
  315. db.emp.find({
  316. depno:depno});
  317. //31.查询销售部的所有员工
  318. var depno = db.dept.findOne({
  319. dname:"销售部"}).deptno;
  320. db.emp.find({
  321. depno:depno});
  322. //32.查询所有mgr为7698的所有员工
  323. db.emp.find({
  324. mgr:7698})
  325. //33.为所有薪资低于1000的员工增加工资400元
  326. db.emp.updateMany({
  327. sal:{
  328. $lte:1000}} , {
  329. $inc:{
  330. sal:400}});
  331. db.emp.find()

3.7 sort和投影

sort

  • 查询文档时,默认情况是按照_id的值进行排列(升序)
  • sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
  • limit skip sort 可以以任意的顺序进行调用

    // 先按照工资升序排序,后面按照部门编号降序排序
    db.emp.find({

    1. }).sort({
    2. sal:1,empno:-1});

投影

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

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

④ 文档之间的关系

一对一(one to one)

  • 夫妻 (一个丈夫 对应 一个妻子)
  • 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系

    db.wifeAndHusband.insert([

    1. {
    2. name:"黄蓉",
    3. husband:{
    4. name:"郭靖"
    5. }
    6. },{
    7. name:"潘金莲",
    8. husband:{
    9. name:"武大郎"
    10. }
    11. }

    ]);
    db.wifeAndHusband.find();

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

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

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

  1. //一对多 用户(users) 和 订单(orders)
  2. db.users.insert([{
  3. username:"swk"
  4. },{
  5. username:"zbj"
  6. }]);
  7. db.order.insert({
  8. list:["牛肉","漫画"],
  9. user_id: ObjectId("59c47e35241d8d36a1d50de0")
  10. });
  11. db.users.find()
  12. db.order.find()
  13. //查找用户swk的订单
  14. var user_id = db.users.findOne({
  15. username:"zbj"})._id;
  16. db.order.find({
  17. user_id:user_id});

多对多(many to many)

  • 分类 - 商品
  • 老师 - 学生

    //多对多
    db.teachers.insert([

    1. {
    2. name:"洪七公"},
    3. {
    4. name:"黄药师"},
    5. {
    6. name:"龟仙人"}

    ]);

    db.stus.insert([

    1. {
    2. name:"郭靖",
    3. tech_ids:[
    4. ObjectId("59c4806d241d8d36a1d50de4"),
    5. ObjectId("59c4806d241d8d36a1d50de5")
    6. ]
    7. },{
    8. name:"孙悟空",
    9. tech_ids:[
    10. ObjectId("59c4806d241d8d36a1d50de4"),
    11. ObjectId("59c4806d241d8d36a1d50de5"),
    12. ObjectId("59c4806d241d8d36a1d50de6")
    13. ]
    14. }

    ])

⑤ Spring Boot整合MongoDB

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

(1)MongoTemplate

(2)MongoRepository

MongoRepository操作简单,MongoTemplate操作灵活

  • 创建spring boot项目
  • 导入依赖

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>cn.cvzhanshi</groupId>
    6. <artifactId>mongodb</artifactId>
    7. <version>0.0.1-SNAPSHOT</version>
    8. <name>mongodb</name>
    9. <description>Demo project for Spring Boot</description>
    10. <properties>
    11. <java.version>1.8</java.version>
    12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    15. </properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.boot</groupId>
    19. <artifactId>spring-boot-starter-data-mongodb</artifactId>
    20. </dependency>
    21. <!-- 引入lombok -->
    22. <dependency>
    23. <groupId>org.projectlombok</groupId>
    24. <artifactId>lombok</artifactId>
    25. <optional>true</optional>
    26. </dependency>
    27. <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
    28. <dependency>
    29. <groupId>cn.hutool</groupId>
    30. <artifactId>hutool-all</artifactId>
    31. <version>5.8.5</version>
    32. </dependency>
    33. <dependency>
    34. <groupId>org.springframework.boot</groupId>
    35. <artifactId>spring-boot-starter-web</artifactId>
    36. </dependency>
    37. <dependency>
    38. <groupId>org.springframework.boot</groupId>
    39. <artifactId>spring-boot-starter-test</artifactId>
    40. <scope>test</scope>
    41. <exclusions>
    42. <exclusion>
    43. <groupId>org.junit.vintage</groupId>
    44. <artifactId>junit-vintage-engine</artifactId>
    45. </exclusion>
    46. </exclusions>
    47. </dependency>
    48. </dependencies>
    49. <dependencyManagement>
    50. <dependencies>
    51. <dependency>
    52. <groupId>org.springframework.boot</groupId>
    53. <artifactId>spring-boot-dependencies</artifactId>
    54. <version>${spring-boot.version}</version>
    55. <type>pom</type>
    56. <scope>import</scope>
    57. </dependency>
    58. </dependencies>
    59. </dependencyManagement>
    60. </project>
  • 编写配置文件

    1. spring:
    2. data:
    3. mongodb:
    4. host: localhost
    5. port: 27017
    6. # 数据库不一定要事先创建好
    7. database: mongodb_demo
  • 创建实体类

    1. /**
    2. * @author cVzhanshi
    3. * @create 2022-10-26 19:14
    4. */
    5. @Data
    6. @AllArgsConstructor
    7. @NoArgsConstructor
    8. @Accessors(chain = true)
    9. // 对应Collection名
    10. @Document("user")
    11. public class User {
    12. @Id
    13. private String id;
    14. private String name;
    15. private Integer age;
    16. private String email;
    17. private Date createDate;
    18. }

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 插入操作

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

5.1.2 修改操作

  1. @Test
  2. void updateUserForRepo() {
  3. User user = userRepository.findById("635921e925015871927c1d09").get();
  4. user.setName("1111");
  5. user.setAge(26);
  6. User save = userRepository.save(user);
  7. System.out.println(save);
  8. }

5.1.3 删除操作

  1. @Test
  2. void deleteByIdUserForRepo() {
  3. userRepository.deleteById("635921e925015871927c1d09");
  4. }

5.1.4 查询操作

  1. @Test
  2. void queryUserForRepo() {
  3. /**
  4. * 根据id查询
  5. */
  6. User user = userRepository.findById("635921e925015871927c1d09").get();
  7. System.out.println(user);
  8. /**
  9. * 查询所有
  10. */
  11. userRepository.findAll().forEach(System.out::println);
  12. /**
  13. * 查询所有并排序
  14. */
  15. Sort sort = Sort.by(Sort.Direction.DESC, "age");
  16. userRepository.findAll(sort).forEach(System.out::println);
  17. /**
  18. * 条件查询
  19. */
  20. Example<User> userExample = Example.of(new User().setName("cvzhanshi1121"));
  21. userRepository.findAll(userExample).forEach(System.out::println);
  22. /**
  23. * 分页查询
  24. */
  25. //page=0表示第一页
  26. PageRequest pageable = PageRequest.of(0, 2);
  27. Page<User> all = userRepository.findAll(pageable);
  28. List<User> userList = all.getContent();
  29. userList.forEach(u -> {
  30. System.out.println(u);
  31. });
  32. long totalElements = all.getTotalElements();//总记录数
  33. int totalPages = all.getTotalPages();//总页数
  34. System.out.println("总记录数:"+ totalElements);
  35. System.out.println("总页数:"+ totalPages);
  36. }
  37. @Test
  38. void pageSortQueryUser(){
  39. /**
  40. * 分页查询并排序
  41. */
  42. Sort sort = Sort.by(Sort.Direction.DESC, "age");
  43. //page=0表示第一页
  44. PageRequest pageable = PageRequest.of(0, 2,sort);
  45. Page<User> all = userRepository.findAll(pageable);
  46. List<User> userList = all.getContent();
  47. userList.forEach(u -> {
  48. System.out.println(u);
  49. });
  50. long totalElements = all.getTotalElements();//总记录数
  51. int totalPages = all.getTotalPages();//总页数
  52. System.out.println("总记录数:"+ totalElements);
  53. System.out.println("总页数:"+ totalPages);
  54. }
  55. @Test
  56. void queryLikeForRepoUser(){
  57. /**
  58. * 分页查询并排序
  59. */
  60. User user = new User();
  61. user.setName("cvzhanshi1121");
  62. //模糊查询固定格式
  63. ExampleMatcher matcher =
  64. ExampleMatcher
  65. .matching()
  66. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//模糊查询
  67. .withIgnoreCase(true); //忽略大小写
  68. Example<User> example = Example.of(user,matcher);
  69. List<User> userList = userRepository.findAll(example);
  70. userList.forEach(System.out::println);
  71. }
  72. @Test
  73. void queryLikePageSortForRepoUser(){
  74. /**
  75. * 分页排序加模糊查询
  76. */
  77. Sort sort = Sort.by(Sort.Direction.DESC, "age");
  78. //page=0表示第一页
  79. PageRequest pageable = PageRequest.of(0, 4,sort);
  80. //模糊查询
  81. ExampleMatcher matcher = ExampleMatcher.matching()
  82. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
  83. .withIgnoreCase(true);
  84. User user = new User();
  85. user.setName("est");
  86. Example<User> example = Example.of(user, matcher);
  87. Page<User> pages = userRepository.findAll(example, pageable);
  88. List<User> userList = pages.getContent();
  89. userList.forEach(System.out::println);
  90. }

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查询

测试类

  1. @SpringBootTest
  2. class MongodbApplicationTests {
  3. @Autowired
  4. private MongoTemplate mongoTemplate;
  5. }

5.2.1 插入操作

  1. // 插入一条记录
  2. @Test
  3. void addOneUser() {
  4. User user = new User()
  5. .setAge(22)
  6. .setName("cvzhanshi")
  7. .setEmail("cvzhanshi@qq.com")
  8. .setCreateDate(DateUtil.date());
  9. mongoTemplate.insert(user);
  10. }
  11. // 插入多条记录
  12. @Test
  13. void addManyUser() {
  14. ArrayList<User> users = new ArrayList<>();
  15. for (int i = 0; i < 10; i++) {
  16. User user = new User()
  17. .setAge(22)
  18. .setName("cvzhanshi")
  19. .setEmail("cvzhanshi@qq.com")
  20. .setCreateDate(DateUtil.date());
  21. users.add(user);
  22. }
  23. // 第一个参数,要插入的集合
  24. // 第二个参数,collectionNmae
  25. mongoTemplate.insert(users,"user");
  26. }

5.2.2 修改操作

updateMulti 修改
  1. @Test
  2. void updateMultiUser() {
  3. // 修改的条件
  4. Query query = new Query(Criteria.where("name").is("cvzhanshi"));
  5. // 修改的属性及其要修改的值
  6. Update update = new Update();
  7. update.set("name","cvzhanshi111");
  8. update.set("age",11);
  9. // 修改满足条件的所有文档
  10. UpdateResult result = mongoTemplate.updateMulti(query, update, "user");
  11. }
save修改
  1. @Test
  2. void updateSaveUser() {
  3. User user = mongoTemplate.findById("63591941ae0958363215b15f", User.class);
  4. user.setName("testsave");
  5. // user有id save()执行修改指定文档 无id 执行新增操作
  6. mongoTemplate.save(user);
  7. }

5.2.3 删除操作

remove带条件删除

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

5.2.4 查询操作

  1. @Test
  2. void queryUser() {
  3. /**
  4. * 查询全部
  5. */
  6. List<User> users = mongoTemplate.findAll(User.class);
  7. users.forEach(System.out::println);
  8. /**
  9. * 根据id查询
  10. */
  11. User user = mongoTemplate.findById("63591941ae0958363215b15f", User.class);
  12. System.out.println(user);
  13. /**
  14. * 根据条件查询
  15. */
  16. Query query = new Query();
  17. //is方法的参数类型object,但是实际传入的值一定和字段本身的类型要一致
  18. query.addCriteria(Criteria.where("name").is("cvzhanshi1121"));
  19. List<User> userList = mongoTemplate.find(query, User.class);
  20. userList.forEach(System.out::println);
  21. /**
  22. * 分页查询/带条件分页查询
  23. */
  24. Query query1 = new Query(Criteria.where("age").is(11)).skip(0).limit(3);
  25. List<User> userList2 = mongoTemplate.find(query1, User.class);
  26. userList2.forEach(u -> {
  27. System.out.println(u);
  28. });
  29. }
  30. @Test
  31. void queryLikeUser() {
  32. /**
  33. * 模糊查询
  34. */
  35. String name = "1";
  36. //这几行固定格式的,实现模糊查询
  37. String regex = String.format("%s%s%s", "^.*", name, ".*$");
  38. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  39. Query query = new Query(Criteria.where("name").regex(pattern));
  40. List<User> userList = mongoTemplate.find(query, User.class);
  41. userList.forEach(System.out::println);
  42. }

发表评论

表情:
评论列表 (有 0 条评论,138人围观)

还没有评论,来说两句吧...

相关阅读