Java MongoDB操作详解
Java MongoDB操作详解
什么是MongoDB
MongoDB是一个基于文档的NoSQL数据库,使用JSON风格的文档存储数据,适合半结构化数据和快速迭代的场景。
Spring Data MongoDB
依赖配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置
spring:
data:
mongodb:
uri: mongodb://localhost:27017/mydb
文档定义
@Document(collection = "users")
public class User {
@Id
private String id;
@Field("user_name")
private String name;
private String email;
private int age;
@DBRef
private Department department;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
@Document(collection = "departments")
public class Department {
@Id
private String id;
private String name;
}
基本CRUD
@Repository
public interface UserRepository extends MongoRepository<User, String> {
// 基本查询方法(方法名查询)
List<User> findByName(String name);
Optional<User> findByEmail(String email);
List<User> findByAgeBetween(int min, int max);
List<User> findByAgeOrderByAgeDesc(int age);
List<User> findByNameContaining(String keyword);
List<User> findByNameAndAge(String name, int age);
// 分页查询
Page<User> findByAge(int age, Pageable pageable);
// 使用@Query注解
@Query("{ 'age': { $gte: ?0, $lte: ?1 } }")
List<User> findByAgeRange(int minAge, int maxAge);
@Query("{ 'name': { $regex: ?0, $options: 'i' } }")
List<User> findByNameRegex(String regex);
}
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(User user) {
return userRepository.save(user);
}
public Optional<User> getUser(String id) {
return userRepository.findById(id);
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User updateUser(String id, User user) {
user.setId(id);
return userRepository.save(user);
}
public void deleteUser(String id) {
userRepository.deleteById(id);
}
public Page<User> getUsersByAge(int age, int page, int size) {
return userRepository.findByAge(age, PageRequest.of(page, size));
}
}
MongoTemplate高级操作
@Component
public class UserCustomRepository {
private final MongoTemplate mongoTemplate;
public UserCustomRepository(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
// 动态查询
public List<User> findByCriteria(String name, Integer minAge, Integer maxAge) {
Query query = new Query();
if (name != null) {
query.addCriteria(Criteria.where("name").regex(name, "i"));
}
if (minAge != null) {
query.addCriteria(Criteria.where("age").gte(minAge));
}
if (maxAge != null) {
query.addCriteria(Criteria.where("age").lte(maxAge));
}
return mongoTemplate.find(query, User.class);
}
// 聚合查询
public List<Document> getAgeDistribution() {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("age").count().as("count"),
Aggregation.sort(Sort.Direction.ASC, "_id")
);
return mongoTemplate.aggregate(aggregation, "users", Document.class)
.getMappedResults();
}
// 更新操作
public UpdateResult updateAge(String name, int newAge) {
Query query = Query.query(Criteria.where("name").is(name));
Update update = Update.update("age", newAge);
return mongoTemplate.updateFirst(query, update, User.class);
}
// 数组操作
public void addTag(String userId, String tag) {
Query query = Query.query(Criteria.where("_id").is(userId));
Update update = Update.addToSet("tags", tag);
mongoTemplate.updateFirst(query, update, User.class);
}
}
响应式MongoDB
@Repository
public interface ReactiveUserRepository extends ReactiveMongoRepository<User, String> {
Flux<User> findByAge(int age);
Mono<User> findByEmail(String email);
}
@Service
public class ReactiveUserService {
private final ReactiveUserRepository repository;
public ReactiveUserService(ReactiveUserRepository repository) {
this.repository = repository;
}
public Mono<User> createUser(User user) {
return repository.save(user);
}
public Flux<User> findAll() {
return repository.findAll();
}
public Mono<User> findById(String id) {
return repository.findById(id);
}
}
事务支持
@Service
public class TransferService {
private final MongoTemplate mongoTemplate;
@Transactional
public void transfer(String fromId, String toId, BigDecimal amount) {
// 扣减
Query fromQuery = Query.query(Criteria.where("_id").is(fromId));
Update fromUpdate = Update.update("balance", new BigDecimal("-" + amount));
mongoTemplate.updateFirst(fromQuery, fromUpdate, Account.class);
// 增加
Query toQuery = Query.query(Criteria.where("_id").is(toId));
Update toUpdate = Update.update("balance", new BigDecimal("+" + amount));
mongoTemplate.updateFirst(toQuery, toUpdate, Account.class);
}
}
总结
MongoDB是处理半结构化数据的理想选择。Spring Data MongoDB提供了简洁的CRUD API,MongoTemplate支持复杂的查询和聚合操作。结合响应式编程可以构建高性能的数据访问层。