当前位置:   article > 正文

SpringBoot使用MongoTemplate详解

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>

2.MongoDbHelper封装

  1. /**
  2. * MongoDB Operation class
  3. * @author HyoJung
  4. * @date 2024-03-05
  5. */
  6. public class MongoDbHelper {
  7. @Autowired
  8. private MongoTemplate mongoTemplate;
  9. /**
  10. * Save Individual Objects
  11. *
  12. * @param t 实体类参数
  13. * @param <T> 实体类
  14. * @return
  15. */
  16. public <T> T save(T t) {
  17. return mongoTemplate.insert(t);
  18. }
  19. /**
  20. * Store the object to the specified collectionName
  21. * @param objectToSave
  22. * @param collectionName 类似SQL数据库的表名
  23. * @param <T>
  24. * @return
  25. */
  26. public <T> T save(T objectToSave, String collectionName){
  27. return mongoTemplate.insert(objectToSave,collectionName);
  28. }
  29. /**
  30. * 批量存储
  31. *
  32. * @param list
  33. * @param collectionName
  34. * @return
  35. */
  36. public <T> Collection<T> batchSave(Collection<T> list, String collectionName) {
  37. return mongoTemplate.insert(list,collectionName);
  38. }
  39. /**
  40. * Query Data
  41. *
  42. * @param query
  43. * @param tClass
  44. * @param <T>
  45. * @return
  46. */
  47. public <T> List<T> find(Query query, Class<T> tClass) {
  48. return mongoTemplate.find(query, tClass);
  49. }
  50. /**
  51. * Collection specified by query data
  52. *
  53. * @param query
  54. * @param tClass
  55. * @param <T>
  56. * @return
  57. */
  58. public <T> List<T> find(Query query, Class<T> tClass, String collectionName) {
  59. return mongoTemplate.find(query, tClass,collectionName);
  60. }
  61. /**
  62. * 分页查询
  63. * @param query query criteria
  64. * @param pageNum Current Page
  65. * @param pageSize Number of entries per page
  66. * @param sortField Sorted Field
  67. * @param sortType 1:asc;0:desc
  68. * @param tClass to class
  69. * @param collectionName collection name
  70. * @param <T>
  71. * @return
  72. */
  73. public <T> MongoPage findByPage(Query query,int pageNum,int pageSize,String sortField,int sortType, Class<T> tClass, String collectionName) {
  74. int count = (int) mongoTemplate.count(query, tClass, collectionName);
  75. if(sortType==1){
  76. query.with(Sort.by(Sort.Order.asc(sortField)));
  77. }else {
  78. query.with(Sort.by(Sort.Order.desc(sortField)));
  79. }
  80. //Set starting number
  81. query.skip((pageNum - 1) * pageSize);
  82. //Set the number of queries
  83. query.limit(pageSize);
  84. //Query the current page data set
  85. List<T> taskList = mongoTemplate.find(query, tClass,collectionName);
  86. int size=count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
  87. MongoPage page=new MongoPage();
  88. page.setTotal(count);
  89. page.setSize(size);
  90. page.setData(taskList);
  91. return page;
  92. }
  93. /**
  94. * 查询前几条数据
  95. * @param query
  96. * @param limitNum 前几条
  97. * @param sortField 排序字段
  98. * @param sortType 0:倒序;1:正序
  99. * @param tClass
  100. * @param collectionName
  101. * @param <T>
  102. * @return
  103. */
  104. public <T> List<T> findTop(Query query,Integer limitNum,String sortField,int sortType, Class<T> tClass, String collectionName){
  105. if(sortType==1){
  106. query.with(Sort.by(Sort.Order.asc(sortField)));
  107. }else {
  108. query.with(Sort.by(Sort.Order.desc(sortField)));
  109. }
  110. query.limit(limitNum);
  111. return mongoTemplate.find(query, tClass,collectionName);
  112. }
  113. /**
  114. * 查询一条数据
  115. * @param query
  116. * @param sortField
  117. * @param sortType
  118. * @param tClass
  119. * @param collectionName
  120. * @param <T>
  121. * @return
  122. */
  123. public <T> List<T> findOne(Query query,String sortField,int sortType, Class<T> tClass, String collectionName){
  124. if(sortType==1){
  125. query.with(Sort.by(Sort.Order.asc(sortField)));
  126. }else {
  127. query.with(Sort.by(Sort.Order.desc(sortField)));
  128. }
  129. //Set the number of queries
  130. query.limit(1);
  131. //Query the current page data set
  132. List<T> taskList = mongoTemplate.find(query, tClass,collectionName);
  133. return taskList;
  134. }
  135. /**
  136. * Query All
  137. *
  138. * @param tClass
  139. * @param <T>
  140. * @return
  141. */
  142. public <T> List<T> findAll(Class<T> tClass) {
  143. return mongoTemplate.findAll(tClass);
  144. }
  145. /**
  146. * Query all specified collections
  147. *
  148. * @param tClass
  149. * @param collectionName
  150. * @param <T>
  151. * @return
  152. */
  153. public <T> List<T> findAll(Class<T> tClass,String collectionName) {
  154. return mongoTemplate.findAll(tClass,collectionName);
  155. }
  156. /**
  157. * create collection
  158. * @param collName
  159. * @param indexList
  160. * @return
  161. */
  162. public boolean createCollection(String collName, List<Map<String,Integer>> indexList){
  163. try {
  164. if (mongoTemplate.collectionExists(collName)) {
  165. return true;
  166. }
  167. //Index collection to be created
  168. List<IndexModel> indexModels = new ArrayList<>();
  169. for (Map<String, Integer> indexMap : indexList) {
  170. BasicDBObject index = new BasicDBObject();
  171. for (String key : indexMap.keySet()) {
  172. index.put(key, indexMap.get(key));
  173. }
  174. indexModels.add(new IndexModel(index));
  175. }
  176. mongoTemplate.createCollection(collName).createIndexes(indexModels);
  177. return true;
  178. }catch (Exception e){
  179. return false;
  180. }
  181. }
  182. /**
  183. * Update the first result set returned by the query
  184. * @param query
  185. * @param update
  186. * @param collectionName
  187. * @return
  188. */
  189. public boolean updateFirst(Query query, Update update, String collectionName){
  190. try {
  191. mongoTemplate.updateFirst(query, update, collectionName);
  192. return true;
  193. }catch (Exception e){
  194. return false;
  195. }
  196. }
  197. /**
  198. * Update all returned result sets
  199. * @param query
  200. * @param update
  201. * @param collectionName
  202. * @return
  203. */
  204. public boolean updateMulti(Query query, Update update, String collectionName){
  205. try {
  206. mongoTemplate.updateMulti(query, update, collectionName);
  207. return true;
  208. }catch (Exception e){
  209. return false;
  210. }
  211. }
  212. /**
  213. * If the update object does not exist, add it
  214. * @param query
  215. * @param update
  216. * @param tClass
  217. * @param <T>
  218. * @param collectionName
  219. * @return
  220. */
  221. public <T> boolean upsert(Query query, Update update, Class<T> tClass,String collectionName){
  222. try {
  223. mongoTemplate.upsert(query, update, tClass,collectionName);
  224. return true;
  225. }catch (Exception e){
  226. return false;
  227. }
  228. }
  229. /**
  230. * 存在则更新不存在则创建
  231. * @param query
  232. * @param update
  233. * @param collectionName
  234. * @return
  235. */
  236. public boolean upsert(Query query, Update update, String collectionName){
  237. try {
  238. mongoTemplate.upsert(query, update,collectionName);
  239. return true;
  240. }catch (Exception e){
  241. return false;
  242. }
  243. }
  244. /**
  245. * 汇总查询
  246. * @param aggregation
  247. * @param tClass
  248. * @param collectionName
  249. * @param <T>
  250. * @return
  251. */
  252. public <T> List<T> groupQuery(Aggregation aggregation,Class<T> tClass,String collectionName){
  253. AggregationResults<T> maps = mongoTemplate.aggregate(aggregation, collectionName, tClass);
  254. return maps.getMappedResults();
  255. }
  256. /**
  257. * 查总条数
  258. * @param query
  259. * @param collectionName
  260. * @return
  261. */
  262. public long queryCount(Query query, String collectionName){
  263. return mongoTemplate.count(query, collectionName);
  264. }
  265. /**
  266. * @description: 删除消息数据
  267. * @param query
  268. * @param collectionName
  269. **/
  270. public long delete(Query query,String collectionName) {
  271. return this.mongoTemplate.remove(query,collectionName).getDeletedCount();
  272. }
  273. }

MongoPage实体类

  1. /**
  2. * MongoDB paged query returns result set
  3. * @author HyoJung
  4. * @date 2024-03-05
  5. */
  6. @Data
  7. public class MongoPage {
  8. /**
  9. * Total number of data
  10. */
  11. private Integer total;
  12. /**
  13. * Page count
  14. */
  15. private Integer size;
  16. /**
  17. * Data result set per page
  18. */
  19. private Object data;
  20. }

3.MongoDB命令说明

3.1.Insert默认集合插入

mongoDB命令:

db.comment.insert({_id:"4",nickname:"ww",content:"这位是谁啊",userId:3,createTime:……})

mongoTemplate对应的方法

mongoTemplate.insert();

我们常用的方法是:

1.将一个实体对象插入指定表中

  1. /**
  2. * 将一个实体对象存储到指定的表中
  3. * @param objectToSave
  4. * @param collectionName 类似SQL数据库的表名
  5. * @param <T>
  6. * @return
  7. */
  8. public <T> T insert(T objectToSave, String collectionName){
  9. return mongoTemplate.insert(objectToSave,collectionName);
  10. }

2.将一个List批量插入指定表中

  1. /**
  2. * 将一个集合插入指定的表中
  3. *
  4. * @param list 对象集合
  5. * @param collectionName 表名
  6. * @return
  7. */
  8. public <T> Collection<T> batchInsert(Collection<T> list, String collectionName) {
  9. return mongoTemplate.insert(list,collectionName);
  10. }

3.2.save默认集合插入

mongoDB 命令:

db.comment.save({})

使用save进行插入时会根据id进行判断,如果要插入数据中的id在数据库存在,则会将旧的数据覆盖,如果不存在则插入数据。

mongoTemplate对应的方法

mongoTemplate.save();

方法封装:

  1. /**
  2. * 将一个实体对象存储到指定的表中
  3. * @param objectToSave
  4. * @param collectionName 类似SQL数据库的表名
  5. * @param <T>
  6. * @return
  7. */
  8. public <T> T save(T objectToSave, String collectionName){
  9. return mongoTemplate.save(objectToSave,collectionName);
  10. }

3.3.insert与save的区别

在MongoTemplate中,save()和insert()方法有以下区别:

save()方法:save()方法用于插入新文档或更新现有文档。如果要保存的文档没有id字段,将插入一个新文档。如果文档具有id字段,MongoDB将尝试使用匹配的id值更新文档。如果找不到具有匹配id的文档,则插入一个新文档。

insert()方法:insert()方法用于向集合中插入新文档。如果要插入的文档已经具有id字段,并且集合中已经存在具有相同id值的文档,则会抛出异常。这确保插入的文档具有唯一的_id值。

总结:save()方法用于插入和更新操作,而insert()方法专门用于插入新文档,并确保_id字段的唯一性。

3.4.修改数据

3.4.1.修改符合条件的第一条数据

mongoDB 命令:

db.comment.update({},{})

mongoTemplate对应的方法

mongoTemplate.updateFirst();

方法封装:

  1. /**
  2. * 修改符合条件的第一条数据
  3. * @param query
  4. * @param update
  5. * @param collectionName
  6. * @return
  7. */
  8. public boolean updateFirst(Query query, Update update, String collectionName){
  9. try {
  10. mongoTemplate.updateFirst(query, update, collectionName);
  11. return true;
  12. }catch (Exception e){
  13. return false;
  14. }
  15. }

3.4.2.修改符合条件的全部数据

mongoDB 命令:

db.comment.update({},{},{multi:true})

mongoTemplate对应的方法

mongoTemplate.updateMulti();

方法封装:

  1. /**
  2. * 修改符合条件的全部数据
  3. * @param query
  4. * @param update
  5. * @param collectionName
  6. * @return
  7. */
  8. public boolean updateMulti(Query query, Update update, String collectionName){
  9. try {
  10. mongoTemplate.updateMulti(query, update, collectionName);
  11. return true;
  12. }catch (Exception e){
  13. return false;
  14. }
  15. }

mongoTemplate对应的方法的返回结果是UpdateResult,也可以通过此结果返回状态进行更深度的判断是否修改成功。

3.5.删除数据

3.5.1.删除满足条件的所有文档

mongoDB 命令:

db.comment.remove({})

mongoTemplate对应的方法:

mongoTemplate.remove();

方法封装:

  1. /**
  2. * @description: 删除满足条件的所有文档
  3. * @param query
  4. * @param collectionName
  5. **/
  6. public long delete(Query query,String collectionName) {
  7. return this.mongoTemplate.remove(query,collectionName).getDeletedCount();
  8. }

如果query条件为空时则删除当前集合所有的记录。

方法封装:

  1. /**
  2. * @description: 删除满足条件的所有文档
  3. * @param collectionName
  4. **/
  5. public long delete(String collectionName) {
  6. return this.mongoTemplate.remove(new Query(),collectionName).getDeletedCount();
  7. }

3.5.2.删除满足条件的单个文档并返回当前删除的数据

mongoTemplate对应的方法

mongoTemplate.findAndRemove();

3.5.3.删除满足条件的所有文档并返回当前删除的数据集合

mongoTemplate对应的方法

mongoTemplate.findAllAndRemove();

3.6.查询数据

3.6.1.查询全部文档

mongoDB 命令:

db.comment.find()

mongoTemplate对应的方法

mongoTemplate.findAll();

3.6.2.查询指定id的文档

mongoDB 命令:

db.comment.find({_id:"id"})

mongoTemplate对应的方法

mongoTemplate.findById();

3.6.3.查询满足条件的一条文档

mongoDB 命令:

db.comment.findOne({})

mongoTemplate对应的方法

mongoTemplate.findOne();

3.6.4.查询满足条件的所有文档

mongoDB 命令:

db.comment.find({})

mongoTemplate对应的方法

mongoTemplate.find();

方法封装:

  1. /**
  2. * 查询指定文档下符合条件的记录
  3. *
  4. * @param query
  5. * @param tClass
  6. * @param <T>
  7. * @return
  8. */
  9. public <T> List<T> find(Query query, Class<T> tClass, String collectionName) {
  10. return mongoTemplate.find(query, tClass,collectionName);
  11. }

3.6.5.分页查询方法封装

  1. /**
  2. * Pagination query
  3. * @param query query criteria
  4. * @param pageNum Current Page
  5. * @param pageSize Number of entries per page
  6. * @param sortField Sorted Field
  7. * @param sortType 1:asc;0:desc
  8. * @param tClass to class
  9. * @param collectionName collection name
  10. * @param <T>
  11. * @return
  12. */
  13. public <T> MongoPage findByPage(Query query,int pageNum,int pageSize,String sortField,int sortType, Class<T> tClass, String collectionName) {
  14. int count = (int) mongoTemplate.count(query, tClass, collectionName);
  15. if(sortType==1){
  16. query.with(Sort.by(Sort.Order.asc(sortField)));
  17. }else {
  18. query.with(Sort.by(Sort.Order.desc(sortField)));
  19. }
  20. //Set starting number
  21. query.skip((pageNum - 1) * pageSize);
  22. //Set the number of queries
  23. query.limit(pageSize);
  24. //Query the current page data set
  25. List<T> taskList = mongoTemplate.find(query, tClass,collectionName);
  26. int size=count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
  27. MongoPage page=new MongoPage();
  28. page.setTotal(count);
  29. page.setSize(size);
  30. page.setData(taskList);
  31. return page;
  32. }

3.6.6.查询符合条件的前几条数据

  1. /**
  2. * 查询前几条数据
  3. * @param query
  4. * @param limitNum 前几条
  5. * @param sortField 排序字段
  6. * @param sortType 0:倒序;1:正序
  7. * @param tClass
  8. * @param collectionName
  9. * @param <T>
  10. * @return
  11. */
  12. public <T> List<T> findTop(Query query,Integer limitNum,String sortField,int sortType, Class<T> tClass, String collectionName){
  13. if(sortType==1){
  14. query.with(Sort.by(Sort.Order.asc(sortField)));
  15. }else {
  16. query.with(Sort.by(Sort.Order.desc(sortField)));
  17. }
  18. query.limit(limitNum);
  19. return mongoTemplate.find(query, tClass,collectionName);
  20. }

3.6.7.查询符合条件的总条数

  1. /**
  2. * 查总条数
  3. * @param query
  4. * @param collectionName
  5. * @return
  6. */
  7. public long queryCount(Query query, String collectionName){
  8. return mongoTemplate.count(query, collectionName);
  9. }

3.6.8.Query的更多用法

is查询

  1. Query query = new Query(); // where...is... 相当于 where ? = ?
  2. query.addCriteria(Criteria.where("数据库字段名").is("你的参数"));

in查询

  1. ArrayList<String> list = new ArrayList<>();
  2. // list代表你的数据
  3. Query query = Query.query(Criteria.where("数据库字段").in(list));

字符模糊查询

Query query = Query.query(Criteria.where("name").regex("小"));

查询范围

  1. //此示例是查询指定terminalId某个时间段内的数据
  2. Query query = new Query(Criteria.where("terminalId").is(terminalId).and("timestamp").gte(startTimestamp).lte(endTimestamp));

查询指定字段

  1. //查询指定terminalId某个时间段内的数据后,返回指定的字段fields(List<String>)
  2. Query query = new Query(Criteria.where("terminalId").is(terminalId).and("timestamp").gte(startTimestamp).lte(endTimestamp));
  3. Field findFields = query.fields();
  4. if (!CollectionUtils.isEmpty(fields)) {
  5. fields.forEach(findFields::include);
  6. }

指定字段不返回

query.fields().exclude("field");

3.7.创建一个collection

  1. /**
  2. * create collection
  3. * @param collName
  4. * @param indexList
  5. * @return
  6. */
  7. public boolean createCollection(String collName, List<Map<String,Integer>> indexList){
  8. try {
  9. if (mongoTemplate.collectionExists(collName)) {
  10. return true;
  11. }
  12. //Index collection to be created
  13. List<IndexModel> indexModels = new ArrayList<>();
  14. for (Map<String, Integer> indexMap : indexList) {
  15. BasicDBObject index = new BasicDBObject();
  16. for (String key : indexMap.keySet()) {
  17. index.put(key, indexMap.get(key));
  18. }
  19. indexModels.add(new IndexModel(index));
  20. }
  21. mongoTemplate.createCollection(collName).createIndexes(indexModels);
  22. return true;
  23. }catch (Exception e){
  24. return false;
  25. }
  26. }

4.术语介绍

在MongoDB中,有别于常见的关系型数据库,一些术语略有不同,如下表所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/199215
推荐阅读
相关标签
  

闽ICP备14008679号