← 返回首页

Java MongoDB操作详解

📂 java ⏱ 3 min 461 words

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支持复杂的查询和聚合操作。结合响应式编程可以构建高性能的数据访问层。