开发外包网站广东省广州市白云区白云湖街道
2026/4/6 7:28:36 网站建设 项目流程
开发外包网站,广东省广州市白云区白云湖街道,宁波住房和城乡建设网站,如何添加wordpress主题大家好#xff0c;我是小悟。 一、MongoDB简介 MongoDB是一个基于分布式文件存储的NoSQL数据库#xff0c;具有以下特点#xff1a; 文档型数据库#xff1a;数据以BSON#xff08;Binary JSON#xff09;格式存储#xff0c;结构灵活无模式设计#xff1a;集合中的文档…大家好我是小悟。一、MongoDB简介MongoDB是一个基于分布式文件存储的NoSQL数据库具有以下特点文档型数据库数据以BSONBinary JSON格式存储结构灵活无模式设计集合中的文档可以有不同的字段无需预先定义表结构高性能支持索引、聚合管道、丰富的查询语言高可用性通过副本集实现数据冗余和故障转移水平扩展通过分片集群实现数据水平拆分丰富的查询功能支持丰富的查询操作符和聚合框架二、整合步骤与代码实现1. 环境准备pom.xml 依赖配置dependencies !-- Spring Boot Starter Data MongoDB -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-mongodb/artifactId /dependency !-- Spring Boot Starter Web (可选用于REST API) -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Lombok (简化代码) -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependenciesapplication.yml 配置spring: data: mongodb: # 连接字符串格式 uri: mongodb://localhost:27017/testdb # 或者分开配置 # host: localhost # port: 27017 # database: testdb # username: user # password: pass # 连接池配置 auto-index-creation: true # 自定义配置 mongodb: collection: user: users product: products2. 实体类定义package com.example.mongodemo.entity; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.Builder; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.time.LocalDateTime; import java.util.List; /** * 用户实体类 * Document 指定MongoDB集合名称 */ Data Builder NoArgsConstructor AllArgsConstructor Document(collection users) // 对应集合名 public class User { Id // MongoDB主键 private String id; Field(username) // 指定字段名可选 private String username; private String email; private Integer age; private Address address; // 嵌套文档 private ListString hobbies; // 数组类型 private LocalDateTime createTime; Field(is_active) private Boolean isActive; /** * 嵌套文档示例 */ Data Builder NoArgsConstructor AllArgsConstructor public static class Address { private String city; private String street; private String zipCode; } }3. Repository接口package com.example.mongodemo.repository; import com.example.mongodemo.entity.User; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; /** * 用户Repository * 继承MongoRepository获得CRUD基本操作 */ Repository public interface UserRepository extends MongoRepositoryUser, String { // 自定义查询方法 - 根据方法名自动生成查询 ListUser findByUsername(String username); ListUser findByAgeGreaterThan(int age); ListUser findByEmailContaining(String domain); OptionalUser findByUsernameAndEmail(String username, String email); long countByIsActiveTrue(); // 使用Query注解自定义查询 Query({ age : { $gt: ?0, $lt: ?1 } }) ListUser findUsersByAgeBetween(int min, int max); Query({ address.city : ?0 }) ListUser findByCity(String city); Query({ hobbies : { $in: ?0 } }) ListUser findByHobbiesIn(ListString hobbies); // 使用正则表达式查询 Query({ email : { $regex: ?0 } }) ListUser findByEmailPattern(String pattern); }4. 自定义Repository实现package com.example.mongodemo.repository.custom; import com.example.mongodemo.entity.User; import java.util.List; public interface CustomUserRepository { ListUser findActiveUsersWithCustomQuery(); void updateUserEmail(String userId, String newEmail); } package com.example.mongodemo.repository.custom.impl; import com.example.mongodemo.entity.User; import com.example.mongodemo.repository.custom.CustomUserRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import java.util.List; Repository RequiredArgsConstructor public class CustomUserRepositoryImpl implements CustomUserRepository { private final MongoTemplate mongoTemplate; Override public ListUser findActiveUsersWithCustomQuery() { Query query new Query(); query.addCriteria(Criteria.where(isActive).is(true)) .addCriteria(Criteria.where(age).gte(18)); return mongoTemplate.find(query, User.class); } Override public void updateUserEmail(String userId, String newEmail) { Query query new Query(Criteria.where(id).is(userId)); Update update new Update(); update.set(email, newEmail); mongoTemplate.updateFirst(query, update, User.class); } }5. 更新主Repository接口package com.example.mongodemo.repository; import com.example.mongodemo.entity.User; import com.example.mongodemo.repository.custom.CustomUserRepository; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; Repository public interface UserRepository extends MongoRepositoryUser, String, CustomUserRepository { // 方法继承自两个接口 }6. Service层实现package com.example.mongodemo.service; import com.example.mongodemo.entity.User; import com.example.mongodemo.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; Service RequiredArgsConstructor Slf4j public class UserService { private final UserRepository userRepository; /** * 创建用户 */ public User createUser(User user) { user.setCreateTime(LocalDateTime.now()); if (user.getIsActive() null) { user.setIsActive(true); } return userRepository.save(user); } /** * 批量插入用户 */ public ListUser batchCreateUsers(ListUser users) { users.forEach(user - { user.setCreateTime(LocalDateTime.now()); if (user.getIsActive() null) { user.setIsActive(true); } }); return userRepository.saveAll(users); } /** * 根据ID查询用户 */ public OptionalUser getUserById(String id) { return userRepository.findById(id); } /** * 查询所有活跃用户 */ public ListUser getActiveUsers() { return userRepository.findByIsActiveTrue(); } /** * 分页查询用户 */ public PageUser getUsersByPage(Pageable pageable) { return userRepository.findAll(pageable); } /** * 根据用户名和邮箱查询 */ public OptionalUser getUserByUsernameAndEmail(String username, String email) { return userRepository.findByUsernameAndEmail(username, email); } /** * 更新用户邮箱 */ public boolean updateUserEmail(String userId, String newEmail) { OptionalUser userOpt userRepository.findById(userId); if (userOpt.isPresent()) { User user userOpt.get(); user.setEmail(newEmail); userRepository.save(user); return true; } return false; } /** * 使用自定义查询更新邮箱 */ public void updateUserEmailWithCustom(String userId, String newEmail) { userRepository.updateUserEmail(userId, newEmail); } /** * 删除用户 */ public boolean deleteUser(String id) { if (userRepository.existsById(id)) { userRepository.deleteById(id); return true; } return false; } /** * 根据年龄范围查询用户 */ public ListUser findUsersByAgeRange(int minAge, int maxAge) { return userRepository.findUsersByAgeBetween(minAge, maxAge); } /** * 统计活跃用户数量 */ public long countActiveUsers() { return userRepository.countByIsActiveTrue(); } }7. Controller层package com.example.mongodemo.controller; import com.example.mongodemo.entity.User; import com.example.mongodemo.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; RestController RequestMapping(/api/users) RequiredArgsConstructor public class UserController { private final UserService userService; PostMapping public ResponseEntityUser createUser(RequestBody User user) { User savedUser userService.createUser(user); return ResponseEntity.status(HttpStatus.CREATED).body(savedUser); } PostMapping(/batch) public ResponseEntityListUser batchCreateUsers(RequestBody ListUser users) { ListUser savedUsers userService.batchCreateUsers(users); return ResponseEntity.status(HttpStatus.CREATED).body(savedUsers); } GetMapping(/{id}) public ResponseEntityUser getUserById(PathVariable String id) { OptionalUser user userService.getUserById(id); return user.map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } GetMapping public ResponseEntityPageUser getAllUsers( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size, RequestParam(defaultValue createTime) String sortBy) { Pageable pageable PageRequest.of(page, size, Sort.by(sortBy).descending()); PageUser users userService.getUsersByPage(pageable); return ResponseEntity.ok(users); } GetMapping(/active) public ResponseEntityListUser getActiveUsers() { ListUser activeUsers userService.getActiveUsers(); return ResponseEntity.ok(activeUsers); } GetMapping(/age-range) public ResponseEntityListUser getUsersByAgeRange( RequestParam int minAge, RequestParam int maxAge) { ListUser users userService.findUsersByAgeRange(minAge, maxAge); return ResponseEntity.ok(users); } PutMapping(/{id}/email) public ResponseEntityVoid updateEmail( PathVariable String id, RequestParam String newEmail) { boolean updated userService.updateUserEmail(id, newEmail); return updated ? ResponseEntity.ok().build() : ResponseEntity.notFound().build(); } DeleteMapping(/{id}) public ResponseEntityVoid deleteUser(PathVariable String id) { boolean deleted userService.deleteUser(id); return deleted ? ResponseEntity.noContent().build() : ResponseEntity.notFound().build(); } GetMapping(/stats/active-count) public ResponseEntityLong getActiveUserCount() { long count userService.countActiveUsers(); return ResponseEntity.ok(count); } }8. 聚合查询示例package com.example.mongodemo.service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.GroupOperation; import org.springframework.data.mongodb.core.aggregation.MatchOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; Service RequiredArgsConstructor Slf4j public class UserAggregationService { private final MongoTemplate mongoTemplate; /** * 按城市分组统计用户数量 */ public ListUserCityStats groupUsersByCity() { GroupOperation groupByCity Aggregation.group(address.city) .count().as(userCount) .avg(age).as(averageAge); Aggregation aggregation Aggregation.newAggregation(groupByCity); AggregationResultsUserCityStats results mongoTemplate.aggregate(aggregation, users, UserCityStats.class); return results.getMappedResults(); } /** * 统计各年龄段用户数量 */ public ListAgeGroupStats groupUsersByAgeGroup() { GroupOperation groupByAgeGroup Aggregation.group( Aggregation.function(cond, Aggregation.function(and, Aggregation.function(gte, age, 0), Aggregation.function(lte, age, 18) ), 0-18, Aggregation.function(cond, Aggregation.function(and, Aggregation.function(gt, age, 18), Aggregation.function(lte, age, 30) ), 19-30, 30 ) ) ).count().as(count); Aggregation aggregation Aggregation.newAggregation(groupByAgeGroup); AggregationResultsAgeGroupStats results mongoTemplate.aggregate(aggregation, users, AgeGroupStats.class); return results.getMappedResults(); } // 统计结果类 public static class UserCityStats { private String city; private Long userCount; private Double averageAge; // getters and setters } public static class AgeGroupStats { private String ageGroup; private Long count; // getters and setters } }9. 事务支持需要MongoDB副本集package com.example.mongodemo.service; import com.example.mongodemo.entity.User; import com.example.mongodemo.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; Service RequiredArgsConstructor public class TransactionalUserService { private final UserRepository userRepository; /** * 事务操作示例 * 注意MongoDB事务需要副本集 */ Transactional(rollbackFor Exception.class) public void createUserWithTransaction(User user1, User user2) { // 保存第一个用户 user1.setCreateTime(LocalDateTime.now()); user1.setIsActive(true); userRepository.save(user1); // 模拟业务逻辑 if (user1.getEmail() null) { throw new RuntimeException(Email is required); } // 保存第二个用户 user2.setCreateTime(LocalDateTime.now()); user2.setIsActive(true); userRepository.save(user2); } }10. 配置类package com.example.mongodemo.config; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.config.EnableMongoAuditing; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; Configuration EnableMongoRepositories(basePackages com.example.mongodemo.repository) EnableMongoAuditing // 启用审计功能 public class MongoConfig { // 可以配置MongoTemplate的自定义设置 // Bean // public MongoTemplate mongoTemplate(MongoDatabaseFactory factory) { // return new MongoTemplate(factory); // } }11. 审计功能自动填充创建/更新时间package com.example.mongodemo.entity; import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.mongodb.core.mapping.Document; import java.time.LocalDateTime; Data Document(collection auditable_entities) public class AuditableEntity { private String id; private String name; CreatedDate private LocalDateTime createdAt; LastModifiedDate private LocalDateTime updatedAt; }12. 测试类package com.example.mongodemo; import com.example.mongodemo.entity.User; import com.example.mongodemo.repository.UserRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; SpringBootTest class MongoDemoApplicationTests { Autowired private UserRepository userRepository; Test void testCRUDOperations() { // 创建用户 User user User.builder() .username(testuser) .email(testexample.com) .age(25) .isActive(true) .hobbies(Arrays.asList(reading, sports)) .build(); // 保存 User savedUser userRepository.save(user); assertThat(savedUser.getId()).isNotNull(); // 查询 ListUser users userRepository.findByUsername(testuser); assertThat(users).hasSize(1); // 更新 savedUser.setEmail(updatedexample.com); userRepository.save(savedUser); // 删除 userRepository.delete(savedUser); // 验证删除 long count userRepository.count(); assertThat(count).isEqualTo(0); } Test void testPagination() { // 创建测试数据 for (int i 0; i 15; i) { User user User.builder() .username(user i) .email(user i example.com) .age(20 i) .isActive(true) .build(); userRepository.save(user); } // 分页查询 PageUser page userRepository.findAll(PageRequest.of(0, 10)); assertThat(page.getContent()).hasSize(10); assertThat(page.getTotalElements()).isEqualTo(15); } }三、总结1. 整合优势Spring Data MongoDB提供了简化的操作通过Repository接口减少大量模板代码强大的查询支持方法名查询、Query注解、Criteria API对象映射自动将文档映射为Java对象事务支持支持MongoDB 4.0的事务功能聚合框架支持复杂的聚合操作审计功能自动填充创建/更新时间2. 最佳实践连接配置使用连接池提高性能合理设置连接参数索引优化为频繁查询的字段创建索引文档设计合理设计文档结构避免过度嵌套批量操作使用批量操作提高数据插入/更新效率读写分离考虑使用副本集实现读写分离3. 注意事项事务要求MongoDB事务需要副本集环境内存管理注意大文档的内存消耗连接管理合理配置连接池大小数据建模根据查询模式设计文档结构索引策略避免过多的索引影响写入性能4. 适用场景内容管理系统文章、评论等半结构化数据物联网应用设备日志、传感器数据实时分析用户行为分析、实时统计社交应用用户动态、消息数据电商平台商品信息、用户收藏SpringBoot与MongoDB的整合提供了高效、灵活的数据存储方案特别适合处理半结构化、快速增长的数据场景。通过Spring Data MongoDB的封装可以像操作传统关系型数据库一样操作MongoDB同时享受NoSQL数据库的灵活性和扩展性优势。谢谢你看我的文章既然看到这里了如果觉得不错随手点个赞、转发、在看三连吧感谢感谢。那我们下次再见。您的一键三连是我更新的最大动力谢谢山水有相逢来日皆可期谢谢阅读我们再会我手中的金箍棒上能通天下能探海

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询