SpringBoot 整合 MongoDB:高级查询篇

上一篇文章,我们讲了如何使用 SpringBoot 整合 MongoDB 实现简单的 CRUD。本文将带你深入了解如何使用 Spring Data MongoDB 执行高级查询,Spring Data MongoDB 为操作 MongoDB 数据库提供了强大的支持,简化了数据访问层的开发工作,接下来我们将结合实际案例,逐步讲解如何构建灵活的查询语句。

1. Spring Data MongoDB 查询基础

在深入高级查询之前,让我们先回顾一下 Spring Data MongoDB 的基本查询方法。

1.1 使用方法名进行查询

Spring Data MongoDB 允许你直接使用方法名来定义简单的查询。例如,要查找所有 name 为 "张三" 的用户:

public interface UserRepository extends MongoRepository {
    List findByName(String name);
}

1.2 使用 @Query 注解进行查询

对于更复杂的查询,可以使用 @Query 注解来自定义查询语句。例如,要查找年龄大于 18 岁的用户:

public interface UserRepository extends MongoRepository {
    @Query("{ 'age' : { $gt: ?0 } }")
    List findByAgeGreaterThan(int age);
}

2. 高级查询详解

2.1 复杂条件查询

2.1.1 使用逻辑运算符

可以使用 $and$or$not 等逻辑运算符来组合多个查询条件。例如,要查找 name 为 "张三" 且年龄大于 18 岁的用户:

@Query("{$and: [{'name': ?0}, {'age': {$gt: ?1}}]}")
List findByNameAndAgeGreaterThan(String name, int age);
2.1.2 使用范围查询

可以使用 $gt$gte$lt$lte 等运算符进行范围查询。例如,要查找年龄在 18 到 30 岁之间的用户:

@Query("{ 'age' : { $gt: ?0, $lt: ?1 } }")
List findByAgeBetween(int startAge, int endAge);

2.2 使用 Projections

Projections 允许你指定要返回的字段,避免查询不需要的数据,提高查询效率。

Repository
@Query(value = "{}", fields = "{ 'name' : 1, 'age' : 1, 'id' : 0 }")
    List findAllNamesAndAges();
Vo
import com.fasterxml.jackson.annotation.JsonProperty;

public class userVo {

    @JsonProperty("name")
    private String name;

    @JsonProperty("age")
    private int age;

    // 省略 getter 和 setter 方法
}

2.3 使用 Criteria 进行动态查询

Criteria 类提供了更灵活的查询条件构建方式,可以根据业务逻辑动态拼接查询条件。

public List query(@RequestParam String name, @RequestParam int minAge,  @RequestParam int maxAge) {
        // 两种写法看个人喜好,效果一样

        // 写法一
//        Criteria criteria = new Criteria();
//        criteria.and("name").regex(name);
//        criteria.and("age").gt(age1).lt(age2);
//        return mongoTemplate.find(new Query(criteria), User.class);

        // 写法二
        Query query = new Query();
        query.addCriteria(Criteria.where("name").regex(name));
        query.addCriteria(Criteria.where("age").gt(age1).lt(age2));
        return mongoTemplate.find(query, User.class);
    }
Criteria 基本比较操作符
操作符 说明 示例
is 等于 criteria.and("name").is("张三")
ne 不等于 criteria.and("age").ne(18)
gt 大于 criteria.and("age").gt(18)
gte 大于等于 criteria.and("age").gte(18)
lt 小于 criteria.and("age").lt(30)
lte 小于等于 criteria.and("age").lte(30)
in 包含在列表中 criteria.and("city").in(Arrays.asList("北京", "上海"))
nin 不包含在列表中 criteria.and("city").nin(Arrays.asList("广州", "深圳"))
Criteria 逻辑运算符
  • and:多个条件同时满足

    criteria.and("name").is("张三").and("age").gt(18);

  • or:多个条件中至少一个满足

    criteria.orOperator(Criteria.where("name").is("张三"), Criteria.where("age").gt(30));​​​​​​​

  • not:不满足条件

    criteria.and("city").not().is("北京"); 
    Criteria 数组操作符
  • all:匹配数组中所有元素

    criteria.and("hobbies").all(Arrays.asList("reading", "music"));s
  • size:匹配数组长度

    criteria.and("hobbies").size(3);
    Criteria 元素操作符
  • exists:判断字段是否存在

    criteria.and("email").exists(true);
  • type:判断字段类型

    criteria.and("age").type(Type.NUMBER);
  • Criteria 正则表达式
criteria.and("name").regex("张");

你可能感兴趣的:(数据库,spring,boot,mongodb,后端,sql)