当前位置: 首页 > news >正文

Springboot操作mongodb的两种方法:MongoTemplate和MongoRepository

导包:
org.springframework.boot:spring-boot-starter-data-mongodb:2.6.7
org.springframework.boot:spring-boot-starter-validation:2.6.7

框架中使用jpa+mongodb,这里记录两种方法操作mongodb,一个是使用mongoTemplate:

实体类:

public abstract class BaseDocument {
  @CreatedDate public Date createDate = new Date();

  @CreatedBy public String createdBy;

  @LastModifiedDate public Date lastModifiedDate = new Date();

  @LastModifiedBy public String lastModifiedBy;
}

@EqualsAndHashCode(callSuper = true)
@Document
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Slf4j
public class Event extends BaseDocument {

  @MongoId(value = FieldType.OBJECT_ID)
  private String id;

  @Indexed private String hostId;

  @Pattern(regexp = "^$|^.{4,255}$", message = "title must be in 5~255 characters")
  private String title;

  @Pattern(regexp = "^$|^[\\w\\W]{4,12225}$", message = "description must be in 5~12225 characters")
  private String description;
  }

使用mongoRepository的方法:


public interface EventRepository extends MongoRepository<Event, String>, EventRepositoryCustom {

  Optional<Event> findById(String eventId);

  void removeById(String eventId);
}

如果是一些复杂的情况如聚合,则需要自己写聚合语句:
例如:

  @Aggregation(
      pipeline = {
        "          {\n"
            + "        $match: {hostId: \"?0\", status: {$in:  ['STARTED','APPROVED']}}},\n"
            + "    },",
        "         {\n"
            + "        $addFields: {\n"
            + "            statusIndex: {\n"
            + "                            $cond: [\n"
            + "                                    { $eq: [\"$event.status\", \"STARTED\"] },\n"
            + "                                    0,\n"
            + "                                    {\n"
            + "                                        $cond: [{$or: [{ $eq: [\"$event.status\","
            + " \"COMMITTED\"] },{ $eq: [\"$event.status\", \"REVIEWING\"] }]}, 1, \n"
            + "                                        {$cond: [{ $eq: [\"$event.status\","
            + " \"APPROVED\"] }, 2, 3]}\n"
            + "                                        ],\n"
            + "                                    },\n"
            + "                                   ]\n"
            + "                          }\n"
            + "                            \n"
            + "                     }\n"
            + "    },",
        "           {\n"
            + "        $sort: {\n"
            + "            statusIndex: 1,\n"
            + "            actualEndDate: -1,\n"
            + "            planStartDate: -1\n"
            + "        }\n"
            + "    },",
        "          {\n" + "        $skip: ?1\n" + "    },",
        "          {\n" + "        $limit: ?2\n" + "    },"
      })
  List<Event> findByHostIdOrderCustom(String hostId, Integer skip, Integer limit);

关于聚合:
文档进入多阶段管道,将文档转换为聚合结果。例如:
在这个例子中:

db.orders.aggregate([
   { $match: { status: "A" } },
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

第一阶段:$match阶段按status字段过滤文档,并将status等于"A"的文档传递到下一阶段。
第二阶段:$group阶段按cust_id字段将文档分组,以计算每个唯一值cust_id的金额总和。
最基本的管道阶段提供_过滤器_,其操作类似于查询和修改输出文档格式的_文档转换_。

使用mongoTemplate:

  @Override
  public Long deleteReplyById(String commentId, String replyId, String userId) {
    Query query =
        Query.query(Criteria.where("replies.id").is(replyId))
            .addCriteria(Criteria.where("id").is(commentId));
    Update update =
        new Update().set("replies.$.deleteDate", new Date()).set("replies.$.deleteBy", userId);
    UpdateResult result = mongoTemplate.updateFirst(query, update, EventComment.class);
    return result.getModifiedCount();
  }

其他的一些数据库操作:

User user = new User();
user.setId("12345");
user.setName("admin");
user.setAddress("测试");

Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","zs");
//  更新一条数据
mongoTemplate.updateFirst(query,update, User.class);
mongoTemplate.updateFirst(query,update, "mongodb_user");
mongoTemplate.updateFirst(query,update, User.class,"mongodb_user");
//  更新多条数据
mongoTemplate.updateMulti(query,update, User.class);
mongoTemplate.updateMulti(query,update,"mongodb_user");
mongoTemplate.updateMulti(query,update, User.class,"mongodb_user");
//  更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, User.class);
mongoTemplate.upsert(query,update,"mongodb_user");
mongoTemplate.upsert(query,update, User.class,"mongodb_user");

相关文章:

  • 流畅的Python读书笔记-第九章-符合Python风格的对象
  • S0011基于51单片机DS18B20温控风扇仿真设计
  • express演示前端解决跨域的方法jsonp、cors
  • SCA Sentinel 分布式系统的流量防控(二)
  • 姿态分析开源工具箱MMPose安装及使用示例(2d face landmark detection)
  • Java8中anyMatch()、allMatch()、noneMatch()用法详解
  • 【SpringMVC】SpringMVC实现转发和重定向
  • 离散化模板
  • 一种加权变异的粒子群算法-附代码
  • 带符号整数的除法与余数
  • Spring Cloud集成Dubbo实现RPC调用
  • 怎么开发自己的NFT平台
  • Android Context
  • 架构师的 36 项修炼第10讲:架构实战案例分析
  • 力扣每日一题-第63天-867. 转置矩阵
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • eclipse的离线汉化
  • es6
  • in typeof instanceof ===这些运算符有什么作用
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • overflow: hidden IE7无效
  • V4L2视频输入框架概述
  • 阿里云应用高可用服务公测发布
  • 大型网站性能监测、分析与优化常见问题QA
  • 多线程 start 和 run 方法到底有什么区别?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 运行时添加log4j2的appender
  • 函数计算新功能-----支持C#函数
  • ​力扣解法汇总946-验证栈序列
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (52)只出现一次的数字III
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (pojstep1.3.1)1017(构造法模拟)
  • (ros//EnvironmentVariables)ros环境变量
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (实战篇)如何缓存数据
  • (转)C#调用WebService 基础
  • (转)jQuery 基础
  • (转)关于pipe()的详细解析
  • ***原理与防范
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net CF下精确的计时器
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net项目IIS、VS 附加进程调试
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [20161214]如何确定dbid.txt
  • [20170713] 无法访问SQL Server
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]Android开发入门之HelloWorld