MongoDB从入门到实战(十):SpringBoot集成MongoDB(MongoTemplate)

x33g5p2x  于2021-12-25 转载在 Go  
字(12.9k)|赞(0)|评价(0)|浏览(616)

一:MongoTemplate

MongoTemplate 是数据库和代码之间的接口,对数据库的操作都在它里面。

  1. MongoTemplate实现了interface MongoOperations。
  2. MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个interface的类来实现的。
  3. MongoTemplate提供了非常多的操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。
  4. MongoTemplate实现了MongoOperations接口, 此接口定义了众多的操作方法如"find", “findAndModify”, “findOne”, “insert”, “remove”, “save”, “update” and "updateMulti"等。
  5. MongoTemplate转换domain object为DBObject,缺省转换类为MongoMappingConverter,并提供了Query, Criteria, and Update等流式API。

MongoTemplate核心操作类:Criteria和Query

  • Criteria类:封装所有的语句,以方法的形式查询。
  • Query类:将语句进行封装或者添加排序之类的操作。

MongoTemplate相比MongoRepository来说更加好用,MongoTemplate的方法名和MongoDB Shell中的函数名字一致,只要熟悉MongoDB Shel中的函数就可以很轻松的使用MongoTemplate。

二:集成

2.1 pom.xml

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

2.2 application.yml

注意:如果密码单独配需要加单引号

  1. spring:
  2. data:
  3. mongodb:
  4. #uri: mongodb://mongo:123456@localhost:27017/test
  5. host: localhost
  6. port: 27017
  7. database: test
  8. username: mongo
  9. password: '123456'

2.3 entity

  1. @Data
  2. @ToString
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class Address implements Serializable {
  6. private String province;
  7. private String city;
  8. }
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class UserInfo {
  5. private Integer gender;
  6. }
  1. @Data
  2. @ToString
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @Document(collection = "user")
  6. @CompoundIndex( def = "{'id': 1, 'nickname': -1}")
  7. public class User implements Serializable {
  8. @Id
  9. private String id;
  10. @Indexed
  11. @Field("username")
  12. private String username;
  13. private String nickname;
  14. private Integer age;
  15. private Date createTime;
  16. private UserInfo userInfo;
  17. private List<String> tags;
  18. private List<Address> addresses;
  19. }
  • @Document(collection = “user”) : 配置集合名字
  • @CompoundIndex( def = “{‘id’: 1, ‘username’: -1}”) : 复合索引
  • @Id : 主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
  • @Field(“字段名”): 该属性对应mongodb的字段的名字,如果一致,则无需该注解
  • @Indexed: 添加了一个单字段的索引

三:MongoTemplate API

3.1 MongoTemplate

操作MongoDB的模板

  1. public class MongoTemplate implements MongoOperations {
  2. /************************************ 集合操作 ************************************/
  3. Set<String> getCollectionNames();
  4. String getCollectionName(Class<?> entityClass);
  5. DBCollection getCollection(String collectionName);
  6. <T> DBCollection createCollection(Class<T> entityClass);
  7. <T> DBCollection createCollection(Class<T> entityClass, CollectionOptions collectionOptions);
  8. DBCollection createCollection(String collectionName);
  9. DBCollection createCollection(String collectionName, CollectionOptions collectionOptions);
  10. <T> boolean collectionExists(Class<T> entityClass);
  11. boolean collectionExists(String collectionName);
  12. <T> void dropCollection(Class<T> entityClass);
  13. void dropCollection(String collectionName);
  14. /************************************ 保存 ************************************/
  15. void insert(Object objectToSave);
  16. void insert(Object objectToSave, String collectionName);
  17. void insert(Collection<? extends Object> batchToSave, Class<?> entityClass);
  18. void insert(Collection<? extends Object> batchToSave, String collectionName);
  19. void insertAll(Collection<? extends Object> objectsToSave);
  20. void save(Object objectToSave);
  21. void save(Object objectToSave, String collectionName);
  22. /****************************** insertOrUpdate *****************************/
  23. WriteResult upsert(Query query, Update update, Class<?> entityClass);
  24. WriteResult upsert(Query query, Update update, String collectionName);
  25. WriteResult upsert(Query query, Update update, Class<?> entityClass, String collectionName);
  26. /************************************ 更新 ***********************************/
  27. WriteResult updateFirst(Query query, Update update, Class<?> entityClass);
  28. WriteResult updateFirst(Query query, Update update, String collectionName);
  29. WriteResult updateFirst(Query query, Update update, Class<?> entityClass, String collectionName);
  30. WriteResult updateMulti(Query query, Update update, Class<?> entityClass);
  31. WriteResult updateMulti(Query query, Update update, String collectionName);
  32. WriteResult updateMulti(final Query query, final Update update, Class<?> entityClass, String collectionName);
  33. /************************************ 查找 ***********************************/
  34. <T> T findOne(Query query, Class<T> entityClass);
  35. <T> T findOne(Query query, Class<T> entityClass, String collectionName);
  36. <T> List<T> findAll(Class<T> entityClass);
  37. <T> List<T> findAll(Class<T> entityClass, String collectionName);
  38. <T> List<T> find(Query query, Class<T> entityClass);
  39. <T> List<T> find(Query query, Class<T> entityClass, String collectionName);
  40. <T> T findById(Object id, Class<T> entityClass);
  41. <T> T findById(Object id, Class<T> entityClass, String collectionName);
  42. <T> T findAndModify(Query query, Update update, Class<T> entityClass);
  43. <T> T findAndModify(Query query, Update update, Class<T> entityClass, String collectionName);
  44. <T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass);
  45. <T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass,
  46. String collectionName);
  47. <T> T findAndRemove(Query query, Class<T> entityClass);
  48. <T> T findAndRemove(Query query, Class<T> entityClass, String collectionName);
  49. /********************************** 删除 **********************************/
  50. WriteResult remove(Object object);
  51. WriteResult remove(Object object, String collection);
  52. WriteResult remove(Query query, Class<?> entityClass);
  53. WriteResult remove(Query query, Class<?> entityClass, String collectionName);
  54. WriteResult remove(Query query, String collectionName);
  55. <T> List<T> findAllAndRemove(Query query, String collectionName);
  56. <T> List<T> findAllAndRemove(Query query, Class<T> entityClass);
  57. <T> List<T> findAllAndRemove(Query query, Class<T> entityClass, String collectionName);
  58. /*********************************** 分组 ***********************************/
  59. <T> GroupByResults<T> group(String inputCollectionName, GroupBy groupBy, Class<T> entityClass);
  60. <T> GroupByResults<T> group(Criteria criteria, String inputCollectionName, GroupBy groupBy, Class<T> entityClass);
  61. /*********************************** 聚合 ***********************************/
  62. <O> AggregationResults<O> aggregate(TypedAggregation<?> aggregation, String collectionName, Class<O> outputType);
  63. <O> AggregationResults<O> aggregate(TypedAggregation<?> aggregation, Class<O> outputType);
  64. <O> AggregationResults<O> aggregate(Aggregation aggregation, Class<?> inputType, Class<O> outputType);
  65. <O> AggregationResults<O> aggregate(Aggregation aggregation, String collectionName, Class<O> outputType);
  66. <T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction,
  67. Class<T> entityClass);
  68. <T> MapReduceResults<T> mapReduce(String inputCollectionName, String mapFunction, String reduceFunction,
  69. MapReduceOptions mapReduceOptions, Class<T> entityClass);
  70. <T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction,
  71. Class<T> entityClass);
  72. <T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction,
  73. MapReduceOptions mapReduceOptions, Class<T> entityClass);
  74. long count(Query query, Class<?> entityClass);
  75. long count(Query query, String collectionName);
  76. long count(Query query, Class<?> entityClass, String collectionName);
  77. boolean exists(Query query, String collectionName);
  78. boolean exists(Query query, Class<?> entityClass);
  79. boolean exists(Query query, Class<?> entityClass, String collectionName);
  80. /*********************************** 地理 ***********************************/
  81. <T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass);
  82. <T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass, String collectionName);
  83. }

3.2 Query

用于构造where条件。

  1. public class Query {
  2. public static Query query(CriteriaDefinition criteriaDefinition);
  3. public Query(CriteriaDefinition criteriaDefinition);
  4. public Query addCriteria(CriteriaDefinition criteriaDefinition);
  5. public Query skip(int skip);
  6. public Query limit(int limit);
  7. public Query withHint(String name);
  8. public Query with(Pageable pageable);
  9. public Query with(Sort sort);
  10. }

3.3 Criteria

用于连接过滤条件。

  1. public class Criteria implements CriteriaDefinition {
  2. public Criteria(String key);
  3. public static Criteria where(String key);
  4. public Criteria and(String key);
  5. public Criteria is(Object o);
  6. public Criteria ne(Object o);
  7. public Criteria lt(Object o);
  8. public Criteria lte(Object o);
  9. public Criteria gt(Object o);
  10. public Criteria gte(Object o);
  11. public Criteria in(Object... o);
  12. public Criteria nin(Object... o);
  13. public Criteria not();
  14. public Criteria regex(String re);
  15. public Criteria andOperator(Criteria... criteria);
  16. public Criteria orOperator(Criteria... criteria);
  17. public Criteria mod(Number value, Number remainder);
  18. public Criteria all(Object... o);
  19. public Criteria size(int s);
  20. public Criteria exists(boolean b);
  21. public Criteria type(int t);
  22. }

3.4 Update

用于更新操作。

  1. public class Update {
  2. public static Update update(String key, Object value);
  3. public Update set(String key, Object value);
  4. public Update inc(String key, Number inc);
  5. public Update push(String key, Object value);
  6. public Update pop(String key, Position pos);
  7. }

四:Test

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. class SpringbootMongodbApplicationTests {
  4. @Autowired
  5. private MongoTemplate mongoTemplate;
  6. @Test
  7. void testMongoDB() {
  8. User document = new User();
  9. document.setId("1");
  10. document.setUsername("monday");
  11. document.setNickname("mengday");
  12. document.setAge(30);
  13. document.setCreateTime(new Date());
  14. document.setUserInfo(new UserInfo(1));
  15. document.setTags(Arrays.asList("xiaojiejie", "dog"));
  16. document.setAddresses(Arrays.asList(
  17. new Address("shanghai", "pudong"),
  18. new Address("beijing", "chaoyang")
  19. ));
  20. mongoTemplate.dropCollection(User.class);
  21. mongoTemplate.save(document);
  22. // 更新
  23. Update update = new Update();
  24. update.set("password", "123456");
  25. update.inc("age", -1);
  26. mongoTemplate.updateMulti(new Query(Criteria.where("_id").in("1", "2")), update, User.class);
  27. List<User> findAll = mongoTemplate.findAll(User.class);
  28. User findById = mongoTemplate.findById("1", User.class);
  29. // is 相当于SQL中的 =
  30. // is的值是类型必须和id的数据类型一致
  31. Query query = new Query();
  32. query.addCriteria(Criteria.where("_id").is("1"));
  33. User findOne = mongoTemplate.findOne(query, User.class);
  34. System.out.println(findOne);
  35. // 左匹配 LIKE 'mon%'
  36. Pattern pattern = Pattern.compile("^mon.*$", Pattern.CASE_INSENSITIVE);
  37. Query regexQuery = new Query(Criteria.where("username").regex(pattern));
  38. List<User> find = mongoTemplate.find(regexQuery, User.class);
  39. System.out.println(find);
  40. // 右匹配 LIKE '%@126.com'
  41. Pattern pattern = Pattern.compile("^.*@126.com$", Pattern.CASE_INSENSITIVE);
  42. Query regexQuery = new Query(Criteria.where("email").regex(pattern));
  43. List<User> findList = mongoTemplate.find(regexQuery, User.class);
  44. // 模糊匹配 LIKE '%法%'
  45. pattern = Pattern.compile("^.法.*$*", Pattern.CASE_INSENSITIVE);
  46. regexQuery = new Query(Criteria.where("username").regex(pattern));
  47. findList = mongoTemplate.find(regexQuery, User.class);
  48. // 完全匹配 = 'monday'
  49. pattern = Pattern.compile("^monday$", Pattern.CASE_INSENSITIVE);
  50. regexQuery = new Query(Criteria.where("username").regex(pattern));
  51. findList = mongoTemplate.find(regexQuery, User.class);
  52. // 多条键查询 andOperator(相当于SQL中的 and并且)
  53. Criteria andCriatira = new Criteria();
  54. andCriatira.andOperator(Criteria.where("age").gte(29), Criteria.where("username").is("monday"));
  55. List<User> find = mongoTemplate.find(new Query(andCriatira), User.class);
  56. // or
  57. Criteria orCriatira = new Criteria();
  58. orCriatira.orOperator(Criteria.where("_id").in("1", "2"), Criteria.where("username").is("monday"));
  59. List<User> find = mongoTemplate.find(new Query(orCriatira), User.class);
  60. // 分页
  61. int page = 1;
  62. int pageSize = 5;
  63. int offset = (page - 1) * pageSize;
  64. Query query = new Query();
  65. Sort sort = Sort.by(Sort.Direction.DESC, "_id");
  66. query.with(sort).skip(offset).limit(pageSize);
  67. List<User> find = mongoTemplate.find(query, User.class);
  68. System.out.println(find);
  69. //封装查询条件
  70. // Aggregation.group("属性名") 不是字段名,不是_id
  71. List<AggregationOperation> operations = new ArrayList<>();
  72. operations.add(Aggregation.match(Criteria.where("_id").is("1")));
  73. operations.add(Aggregation.group("id").sum("age").as("totalAge"));
  74. operations.add(Aggregation.sort(Sort.Direction.DESC, "_id"));
  75. operations.add(Aggregation.skip(1L));
  76. operations.add(Aggregation.limit(2));
  77. Aggregation aggregation = Aggregation.newAggregation(operations);
  78. //查询、并获取结果
  79. AggregationResults<UserAgg> aggregationResults = mongoTemplate.aggregate(aggregation, User.class, UserAgg.class);
  80. List<UserAgg> mappedResults = aggregationResults.getMappedResults();
  81. System.out.println(mappedResults);
  82. }
  83. }
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class UserAgg {
  5. private String id;
  6. private Integer totalAge;
  7. }

相关文章