Springboot 2.X 集成 MongoDB 使用 MongoTemplate 实现基本增删改查


1 摘要

MongoDB 作为应用广泛的文档数据库,Spring 对其提供了丰富的操作支持。主要操作 MongoDB 的类有 MongoRepository 以及 MongoTemplate。关于这两者的关系, MongoRepository 提供了 JPA 风格的操作接口,底层是通过的 MongoTemplate 进行实现,而 MongoTemplate 提供了更加丰富的操作接口。至于要使用哪个类来操作 MongoDB,作者个人认为如果只有简单的增删改查,并且习惯了 JPA 的风格,则可以使用 MongoRepository ,如果有对数据进行复杂的操作,如批量操作、分组统计等,则推荐使用 MongoTemplate。本文将介绍使用 MongoTemplate 实现基本的增删改查(CRUD)。

MongoDB 官方文档: https://docs.atlas.mongodb.com/getting-started

2 核心 Maven 依赖

./demo-mongodb/pom.xml
        <!-- mongodb -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

Spring Boot 提供了官方的集成依赖,版本号与 SpringBoot 版本一致,本示例中版本为 2.4.1

3 配置信息

./demo-mongodb/src/main/resources/application.yml
## config

server:
  port: 8650

## spring config
spring:
  data:
    mongodb:
      authentication-database: admin
      username: root
      password: root666
      database: springboot
      host: 127.0.0.1
      port: 27017

## log
logging:
  level:
    org.springframework.data.mongodb.core.MongoTemplate: debug
    org.springframework.data.couchbase.repository.query : debug

4 核心代码

4.1 实体类

基础实体类

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/entity/BaseEntity.java
package com.ljq.demo.springboot.mongodb.model.entity;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;

/**
 * @Description: 基础实体类
 * @Author: junqiang.lu
 * @Date: 2021/9/24
 */
@Data
public class BaseEntity implements Serializable {

    private static final long serialVersionUID = -3003658740476069858L;

    /**
     * id,主键
     */
    @Id
    @ApiModelProperty(value = "id,主键", name = "id")
    private String id;
    /**
     * 创建时间
     */
    @Field
    @CreatedDate
    @ApiModelProperty(value = "创建时间", name = "createTime")
    private Long createTime;
    /**
     * 修改时间
     */
    @Field
    @LastModifiedDate
    @ApiModelProperty(value = "修改时间", name = "updateTime")
    private Long updateTime;
}

@Id : 标注当前字段为 id 主键

@Field: 标注当前字段为数据库字段

@CreatedDate: 创建时间注解,当插入数据是触发,支持的数据类型有 Long/Date

@LastModifiedDate: 最后更新时间注解,当更新数据时触发,首次插入则时间同 @CreateDate,支持的数据类型有 Long/Date

若要让 @CreateDate@LastModifiedDate 注解生效,需要在 SpringBoot 启动类上添加 @EnableMongoAuditing 注解

博客实体类

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/entity/BlogEntity.java
package com.ljq.demo.springboot.mongodb.model.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

/**
 * @Description: 博客信息
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ToString(callSuper = true)
@Document(value = "blog")
@ApiModel(value = "博客信息", description = "博客信息")
public class BlogEntity extends BaseEntity {

    private static final long serialVersionUID = -2124422309475024490L;

    /**
     * 标题
     */
    @Field
    @ApiModelProperty(value = "标题", name = "title")
    private String title;
    /**
     * 作者
     */
    @Field
    @ApiModelProperty(value = "作者", name = "author")
    private String author;
    /**
     * 内容
     */
    @Field
    @ApiModelProperty(value = "内容", name = "content")
    private String content;
    /**
     * 阅读数量
     */
    @Field
    @ApiModelProperty(value = "阅读数量", name = "countRead")
    private Integer countRead;
    /**
     * 点赞数量
     */
    @Field
    @ApiModelProperty(value = "点赞数量", name = "countLike")
    private Integer countLike;
    /**
     * 客户端时间戳(精确到秒)
     */
    @Field
    @ApiModelProperty(value = "客户端时间戳(精确到秒)", name = "clientTimestamp")
    private Integer clientTimestamp;



}

@Document(value = "blog") : Mongo 文档数据库表注解,value 属性为Mongo数据库表名(集合名称)。

4.2 MongoTemplate 核心操作示例-业务实现类

业务接口

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/service/BlogService.java
package com.ljq.demo.springboot.mongodb.service;

import com.ljq.demo.springboot.mongodb.common.api.ApiResult;
import com.ljq.demo.springboot.mongodb.model.param.*;

/**
 * @Description: 博客业务接口
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
public interface BlogService {

    /**
     * 新增单条博客
     *
     * @param addParam
     * @return
     */
    ApiResult add(BlogAddParam addParam);

    /**
     * 查询单条博客
     *
     * @param queryOneParam
     * @return
     */
    ApiResult queryOne(BlogQueryOneParam queryOneParam);

    /**
     * 分页查询博客
     *
     * @param queryPageParam
     * @return
     */
    ApiResult queryPage(BlogQueryPageParam queryPageParam);

    /**
     * 更新单条博客
     *
     * @param updateParam
     * @return
     */
    ApiResult update(BlogUpdateParam updateParam);

    /**
     * 删除单条博客
     *
     * @param deleteOneParam
     * @return
     */
    ApiResult deleteOne(BlogDeleteOneParam deleteOneParam);

    /**
     * 批量删除博客
     *
     * @param deleteBatchParam
     * @return
     */
    ApiResult deleteBatch(BlogDeleteBatchParam deleteBatchParam);


}

业务实现类

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/service/impl/BlogServiceImpl.java
package com.ljq.demo.springboot.mongodb.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.StrUtil;
import com.ljq.demo.springboot.mongodb.common.api.ApiResult;
import com.ljq.demo.springboot.mongodb.common.api.ResponseCode;
import com.ljq.demo.springboot.mongodb.model.entity.BlogEntity;
import com.ljq.demo.springboot.mongodb.model.param.*;
import com.ljq.demo.springboot.mongodb.service.BlogService;
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.support.PageableExecutionUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * @Description: 博客业务实现类
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Slf4j
@Service("blogService")
public class BlogServiceImpl implements BlogService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增单条博客
     *
     * @param addParam
     * @return
     */
    @Override
    public ApiResult add(BlogAddParam addParam) {
        BlogEntity blogEntity = new BlogEntity();
        BeanUtil.copyProperties(addParam, blogEntity, CopyOptions.create().ignoreError().ignoreNullValue());
        mongoTemplate.save(blogEntity);
        return ApiResult.success(blogEntity);
    }

    /**
     * 查询单条博客
     *
     * @param queryOneParam
     * @return
     */
    @Override
    public ApiResult queryOne(BlogQueryOneParam queryOneParam) {
        Query query = Query.query(Criteria.where("id").is(queryOneParam.getId()));
        return ApiResult.success(mongoTemplate.findOne(query, BlogEntity.class));
    }

    /**
     * 分页查询博客
     *
     * @param queryPageParam
     * @return
     */
    @Override
    public ApiResult queryPage(BlogQueryPageParam queryPageParam) {
        // 查询条件
        Criteria criteria = new Criteria();
        if (StrUtil.isNotBlank(queryPageParam.getId())) {
            criteria = criteria.and("id").is(queryPageParam.getId());
        }
        if (StrUtil.isNotBlank(queryPageParam.getTitle())) {
            Pattern titlePattern = Pattern.compile("^.*" + queryPageParam.getTitle() + ".*$",
                    Pattern.CASE_INSENSITIVE);
            criteria.and("title").regex(titlePattern);
        }
        if (StrUtil.isNotBlank(queryPageParam.getAuthor())) {
            criteria.and("author").is(queryPageParam.getAuthor());
        }
        if (StrUtil.isNotBlank(queryPageParam.getContent())) {
            Pattern contentPattern = Pattern.compile("^.*" + queryPageParam.getContent() + ".*$",
                    Pattern.CASE_INSENSITIVE);
            criteria.and("content").regex(contentPattern);
        }
        Query query = Query.query(criteria);
        // 分页查询
        long count = mongoTemplate.count(query, BlogEntity.class);
        Pageable pageParam = PageRequest.of(queryPageParam.getCurrentPage()-1, queryPageParam.getPageSize(),
                Sort.by(Sort.Direction.DESC, "updateTime"));
        List<BlogEntity> list = mongoTemplate.find(query.with(pageParam), BlogEntity.class);
        Page<BlogEntity> pageResult = PageableExecutionUtils.getPage(list, pageParam, () -> count);
        return ApiResult.success(pageResult);
    }

    /**
     * 更新单条博客
     *
     * @param updateParam
     * @return
     */
    @Override
    public ApiResult update(BlogUpdateParam updateParam) {
        BlogEntity blogEntity = mongoTemplate.findById(updateParam.getId(), BlogEntity.class);
        if (Objects.isNull(blogEntity)) {
            return ApiResult.failure(ResponseCode.BLOG_NOT_EXIST);
        }
        BeanUtil.copyProperties(updateParam, blogEntity, CopyOptions.create().ignoreError().ignoreNullValue());
        mongoTemplate.save(blogEntity);
        return ApiResult.success(blogEntity);
    }

    /**
     * 删除单条博客
     *
     * @param deleteOneParam
     * @return
     */
    @Override
    public ApiResult deleteOne(BlogDeleteOneParam deleteOneParam) {
        DeleteResult result = mongoTemplate.remove(Query.query(Criteria.where("id").is(deleteOneParam.getId())),
                BlogEntity.class);
        if (result.getDeletedCount() < 1) {
            return ApiResult.failure(ResponseCode.BLOG_NOT_EXIST);
        }
        return ApiResult.success();
    }

    /**
     * 批量删除博客
     *
     * @param deleteBatchParam
     * @return
     */
    @Override
    public ApiResult deleteBatch(BlogDeleteBatchParam deleteBatchParam) {
        List<String> idList = deleteBatchParam.getIdList().stream()
                .map(BlogDeleteOneParam::getId).collect(Collectors.toList());
        DeleteResult result = mongoTemplate.remove(Query.query(Criteria.where("id").in(idList)), BlogEntity.class);
        return ApiResult.success(result.getDeletedCount());
    }
}

对象简要说明:

org.springframework.data.mongodb.core.query.Criteria: 用于构建查询条件

org.springframework.data.mongodb.core.query.Query: 查询对象

4.3 其他操作类-请求参数

新增操作请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/BlogAddParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * @Description: 新增单条博客
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ApiModel(value = "新增单条博客", description = "新增单条博客")
public class BlogAddParam implements Serializable {

    private static final long serialVersionUID = -2784787111136075605L;

    /**
     * 标题
     */
    @NotBlank(message = "博客标题不能为空")
    @Length(min = 1, max = 128,message = "博客标题需要控制在 1-128 字符以内")
    @ApiModelProperty(value = "标题", name = "title", required = true)
    private String title;
    /**
     * 作者
     */
    @NotBlank(message = "博客作者不能为空")
    @Length(min = 1, max = 64,message = "博客作者需要控制在 1-64 字符以内")
    @ApiModelProperty(value = "作者", name = "author", required = true)
    private String author;
    /**
     * 内容
     */
    @NotBlank(message = "博客内容不能为空")
    @Length(min = 1, max = 50000,message = "博客内容需要控制在 1-50000 字符以内")
    @ApiModelProperty(value = "内容", name = "content", required = true)
    private String content;
    /**
     * 客户端时间戳(精确到秒)
     */
    @NotNull(message = "客户端时间戳不能为空")
    @ApiModelProperty(value = "客户端时间戳(精确到秒)", name = "clientTimestamp", required = true)
    private Integer clientTimestamp;

}

查询单条请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/BlogQueryOneParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

/**
 * @Description: 查询单条博客
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ApiModel(value = "查询单条博客", description = "查询单条博客")
public class BlogQueryOneParam implements Serializable {

    private static final long serialVersionUID = 4514138839894210912L;

    /**
     * 博客 id
     */
    @NotBlank(message = "博客 ID 不能为空")
    @Pattern(regexp = "^[0-9a-zA-Z]{1,64}$", message = "博客 ID 不合法")
    @ApiModelProperty(value = "博客 ID", name = "id", required = true)
    private String id;

}

分页查询请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/BasePageParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * @Description: 分页查询基础参数
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ApiModel(value = "分页查询基础参数", description = "分页查询基础参数")
public class BasePageParam implements Serializable {

    private static final long serialVersionUID = -1676313147351509759L;

    /**
     * 当前页
     */
    @NotNull(message = "当前页不能为空")
    @Min(value = 1, message = "当前页至少为 1")
    @ApiModelProperty(value = "当前页,不能为空,至少为 1", name = "currentPage", required = true, example = "1")
    private Integer currentPage;
    /**
     * 每页显示条数
     */
    @NotNull(message = "每页显示条数不能为空")
    @Min(value = 3, message = "每页至少展示 3 条结果")
    @Max(value = 100, message = "每页最多展示 100 条结果")
    @ApiModelProperty(value = "每页显示条数,每页至少展示 3 条结果,最多为 100 条", name = "pageSize", required = true,
            example = "5")
    private Integer pageSize;


}
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/BlogQueryPageParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Pattern;

/**
 * @Description: 分页查询博客
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ToString(callSuper = true)
@ApiModel(value = "分页查询博客", description = "分页插叙博客")
public class BlogQueryPageParam extends BasePageParam {

    private static final long serialVersionUID = 362651641919164224L;

    /**
     * 博客 id
     */
    @Pattern(regexp = "^[0-9a-zA-Z]{0,64}$", message = "博客 ID 不合法")
    @ApiModelProperty(value = "博客 ID", name = "id")
    private String id;
    /**
     * 标题
     */
    @Length(max = 128,message = "博客标题需要控制在 128 字符以内")
    @ApiModelProperty(value = "标题", name = "title")
    private String title;
    /**
     * 作者
     */
    @Length(max = 64,message = "博客作者需要控制在 64 字符以内")
    @ApiModelProperty(value = "作者", name = "author")
    private String author;
    /**
     * 内容
     */
    @Length(max = 500,message = "博客内容需要控制在 500 字符以内")
    @ApiModelProperty(value = "内容", name = "content")
    private String content;


}

更新单条请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/BlogUpdateParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

/**
 * @Description: 更新单条博客
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Data
@ApiModel(value = "更新单条博客", description = "更新单条博客")
public class BlogUpdateParam implements Serializable {

    private static final long serialVersionUID = 5995420506930561290L;

    /**
     * 博客 id
     */
    @NotBlank(message = "博客 ID 不能为空")
    @Pattern(regexp = "^[0-9a-zA-Z]{1,64}$", message = "博客 ID 不合法")
    @ApiModelProperty(value = "博客 ID", name = "id", required = true)
    private String id;
    /**
     * 标题
     */
    @NotBlank(message = "博客标题不能为空")
    @Length(min = 1, max = 128,message = "博客标题需要控制在 1-128 字符以内")
    @ApiModelProperty(value = "标题", name = "title", required = true)
    private String title;
    /**
     * 作者
     */
    @NotBlank(message = "博客作者不能为空")
    @Length(min = 1, max = 64,message = "博客作者需要控制在 1-64 字符以内")
    @ApiModelProperty(value = "作者", name = "author", required = true)
    private String author;
    /**
     * 内容
     */
    @NotBlank(message = "博客内容不能为空")
    @Length(min = 1, max = 50000,message = "博客内容需要控制在 1-50000 字符以内")
    @ApiModelProperty(value = "内容", name = "content", required = true)
    private String content;
    /**
     * 客户端时间戳(精确到秒)
     */
    @NotNull(message = "客户端时间戳不能为空")
    @ApiModelProperty(value = "客户端时间戳(精确到秒)", name = "clientTimestamp", required = true)
    private Integer clientTimestamp;

}

删除单条请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserDeleteParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 * 参数接收类
 *
 * @author junqiang.lu
 * @date 2021-01-06 20:03:33
 */
@Data
@ApiModel(value = "删除(单条)", description = "删除(单条)")
public class UserDeleteParam implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * id
     **/
    @NotBlank(message = "id 不能为空")
    @Length(max = 64, message = "id 需要控制在 64 字符以内")
    @ApiModelProperty(value = "id不能为空", name = "id")
    private String id;


}

批量删除请求参数

./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/model/param/UserDeleteBatchParam.java
package com.ljq.demo.springboot.mongodb.model.param;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;

/**
 * @Description: Mongo-用户批量删除
 * @Author: junqiang.lu
 * @Date: 2021/1/20
 */
@Data
@ApiModel(value = "Mongo-用户批量删除", description = "Mongo-用户批量删除")
public class UserDeleteBatchParam implements Serializable {

    private static final long serialVersionUID = -2899668339947463921L;

    /**
     * id 数组
     */
    @NotEmpty(message = "请选择需要删除的条目")
    @Size(max = 100, message = "每次删除的条目不超过 100 条")
    @ApiModelProperty(value = "id 数组", name = "ids")
    private String[] ids;
}
4.4 其他操作类-控制层(Controller)
./demo-mongodb/src/main/java/com/ljq/demo/springboot/mongodb/controller/BlogController.java
package com.ljq.demo.springboot.mongodb.controller;

import com.ljq.demo.springboot.mongodb.common.api.ApiResult;
import com.ljq.demo.springboot.mongodb.model.entity.BlogEntity;
import com.ljq.demo.springboot.mongodb.model.param.*;
import com.ljq.demo.springboot.mongodb.service.BlogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @Description: 博客控制层
 * @Author: junqiang.lu
 * @Date: 2021/11/13
 */
@Slf4j
@RestController
@RequestMapping(value = "/springboot/mongo/blog")
@Api(value = "博客控制层", tags = "博客控制层")
public class BlogController {

    @Autowired
    private BlogService blogService;

    /**
     * 新增单条博客
     *
     * @param addParam
     * @return
     */
    @PostMapping(value = "/add/one")
    @ApiOperation(value = "新增单条博客", notes = "新增单条博客")
    public ResponseEntity<ApiResult<BlogEntity>> add(@RequestBody @Validated BlogAddParam addParam) {
        return ResponseEntity.ok(blogService.add(addParam));
    }

    /**
     * 查询单条博客
     *
     * @param queryOneParam
     * @return
     */
    @GetMapping(value = "/query/one")
    @ApiOperation(value = "查询单条博客", notes = "查询单条博客")
    public ResponseEntity<ApiResult<BlogEntity>> queryOne(@Validated BlogQueryOneParam queryOneParam) {
        return ResponseEntity.ok(blogService.queryOne(queryOneParam));
    }

    /**
     * 分页查询博客
     *
     * @param queryPageParam
     * @return
     */
    @GetMapping(value = "/query/page")
    @ApiOperation(value = "分页查询博客", notes = "分页查询博客")
    public ResponseEntity<ApiResult<Page<BlogEntity>>> queryPage(@Validated BlogQueryPageParam queryPageParam) {
        return ResponseEntity.ok(blogService.queryPage(queryPageParam));
    }

    /**
     * 更新单条博客
     *
     * @param updateParam
     * @return
     */
    @PutMapping(value = "/update/one")
    @ApiOperation(value = "更新单条博客", notes = "更新单条博客")
    public ResponseEntity<ApiResult<BlogEntity>> update(@RequestBody @Validated BlogUpdateParam updateParam) {
        return ResponseEntity.ok(blogService.update(updateParam));
    }

    /**
     * 删除单条博客
     *
     * @param deleteOneParam
     * @return
     */
    @DeleteMapping(value = "/delete/one")
    @ApiOperation(value = "删除单条博客", notes = "删除单条博客")
    public ResponseEntity<ApiResult<Void>> delete(@RequestBody @Validated BlogDeleteOneParam deleteOneParam) {
        return ResponseEntity.ok(blogService.deleteOne(deleteOneParam));
    }

    /**
     * 批量删除博客
     *
     * @param deleteBatchParam
     * @return
     */
    @DeleteMapping(value = "/delete/batch")
    @ApiOperation(value = "批量删除博客", notes = "批量删除博客")
    public ResponseEntity<ApiResult<Void>> deleteBatch(@RequestBody @Validated BlogDeleteBatchParam deleteBatchParam) {
        return ResponseEntity.ok(blogService.deleteBatch(deleteBatchParam));
    }

}

5 推荐参考资料

Spring Mongo 官方文档

spring mongodb 模糊查询

Mongodb系列- spring-data-mongodb使用MongoTemplate实现分页查询

SpringBoot之MongoTemplate的查询可以怎么耍

6 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.
404Code

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值