• 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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @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;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    使用mongoRepository的方法:

    
    public interface EventRepository extends MongoRepository<Event, String>, EventRepositoryCustom {
    
      Optional<Event> findById(String eventId);
    
      void removeById(String eventId);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

      @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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

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

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

    第一阶段:$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();
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其他的一些数据库操作:

    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");
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    年如何在不丢失数据的情况下解锁锁定的 Android 手机?
    体验不尽,进化不止,看视频云技术六大创新
    论文解读(Geom-GCN)《Geom-GCN: Geometric Graph Convolutional Networks》
    物联网为智慧水资源管理提供的三种创新思路
    【第六章 final、abstract】
    C语言 &=(按位与后赋值)^=(按位异或后赋值) |=(按位或后赋值)
    图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制
    编程技巧│Gitee 的 WebHooks 实现代码自动化部署
    【ArcGIS微课1000例】0075:将AutoCAD(Dwg、Dxf)文件转换为shp、KML(kml、kmz)文件
    函数的参数
  • 原文地址:https://blog.csdn.net/qq_41358574/article/details/126676374