该栏目讲叙 MongoDB 相关的知识,包括简介、各模块的操作和与 Spring 的整合



MongoTemplate 相关API

1、常用方法

描述方法
添加文档insert()save()
更新文档update()
删除文档remove()
查询文档findOne()findAll()find()
聚合aggregate()

2、常用类

  • Query类
描述方法
创建对象query(Criteria criteria)
限制查询数量limit(int limit)
跳转skip(int skip)
添加分页或排序with(Page page | Sort sort)
  • Criteria类
描述方法
where条件where(String key)
相等is(String value)
大于gt(String value)
小于lt(String value)
and(Criteria criteria)
or(Criteria criteria)
  • Sort类
描述方法
创建对象Sort.Order.desc(key)
  • Aggregation类
描述方法
创建对象new Aggregation(AggregationOperation op)
  • AggregationOperation类
描述方法
类似于wheremath(Criteria criteria)
分组group(String key)
统计count()
最大值max()
最小值min()
平均值avg()
别名as(String alias)

整合 MongoDB

  • 配置依赖
<!--spring-data依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!--test依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 配置信息
spring:
  data:
    mongodb:
      database: test
      host: 127.0.0.1
      authentication-database: admin
  • 测试代码
// 用户实体
@Document
@Data
@ToString
public class User {

    @Id
    private String id;

    private String name;

    private int age;

    private boolean gender;

}

/

// 相关操作
@SpringBootTest(classes = MongoApplication.class)
public class UserOperationTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 保存用户
     */
    @Test
    public void insertTest() {
        User user = new User();
        user.setName("Near");
        user.setAge(18);
        user.setGender(true);
        final User dbUser = mongoTemplate.insert(user);
        System.out.println("用户信息:" + dbUser);
    }

    /**
     * 如果用户不存在则保存,如果存在则根据id修改
     */
    @Test
    public void saveTest() {
        User user = new User();
        user.setId("608c403db147fe3647a61ef0");
        user.setName("Near2");
        user.setAge(20);
        final User dbUser = mongoTemplate.save(user);
        System.out.println("用户信息:" + dbUser);
    }

    /**
     * 根据条件修改对应字段
     */
    @Test
    public void updateTest() {
        Update update = BasicUpdate.update("name", "lisi2").set("age", 28);
        final UpdateResult result = mongoTemplate.updateFirst(
                Query.query(Criteria.where("name").is("lisi")), update, User.class);
        System.out.println("更新结果:" + result);
    }

    /**
     * 根据条件删除用户
     */
    @Test
    public void removeTest() {
        final DeleteResult result = mongoTemplate.remove(Query.query(Criteria
        						.where("name").is("lisi2")), User.class);
        System.out.println("删除结果:" + result);
    }

    /**
     * 查询用户信息
     */
    @Test
    public void findTest() {
        // 查询单个用户信息
        final User user = mongoTemplate.findOne(Query.query(Criteria.where("name")
        							.is("Near2")), User.class);
        System.out.println("用户信息:" + user);
        System.out.println("=============================");

        // 查询所有用户信息
        List<User> users = mongoTemplate.findAll(User.class);
        users.forEach(System.out::println);
        System.out.println("=============================");

        // 查询年龄大于15且小于20的用户信息,并根据年龄从小到大排序
        final Criteria criteria = Criteria.where("age").gt(15).lt(22);
        users = mongoTemplate.find(Query.query(criteria).with(Sort.by(Sort.Order.asc("age")))
        						, User.class);
        users.forEach(System.out::println);
        System.out.println("=============================");

        // 统计成年用户的个数
        final long count = mongoTemplate.count(Query.query(Criteria.where("age").gte(18)), User.class);
        System.out.println("成年用户的个数:" + count);
        System.out.println("=============================");

        // 分页查询
        final PageRequest pageRequest = PageRequest.of(1, 3);
        final Query query = Query.query(Criteria.where("name").is("zhangsan"));
        users = mongoTemplate.find(query.with(pageRequest), User.class);
        long total = mongoTemplate.count(query, User.class);
        PageImpl<User> userPage = new PageImpl<>(users, pageRequest, total);
        System.out.println("分页信息:" + userPage);
        System.out.println("=============================");

        // 统计各年龄阶段的用户数量
        List<AggregationOperation> operations = new ArrayList<>();
        operations.add(Aggregation.match(Criteria.where("name").is("zhangsan")));
        operations.add(Aggregation.group("age").count().as("count"));
        final AggregationResults<Result> result = mongoTemplate.aggregate(
                Aggregation.newAggregation(operations), "user", Result.class);
        System.out.println("统计结果" + result.getMappedResults());
    }
}

@Data
@AllArgsConstructor
class Result {

    private String id;


    private int count;
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐