Spring boot 宣告 MongoDB Document

非常的简易透过 Spring boot 提供的注解我们可以轻松地宣告和使用

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "connectivity")
public class Connectivity {
    private String name;

    private Integer number;
    
    private String status;
    
    private Integer signalStrength;
    
    @Field("IPlist") 
    private List<Map<String, Object>> ipList;
    
    private Integer contentRevision;
    
    private String deviceId;
    
    private Long contentTimestamp;
}

Document 则是宣告 collection。
Field annotation 可以帮助与 mongoDB 中定义的 field 进行映射。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "gnss")
public class Gnss {
    @Id
    private String id;

    private Integer contentRevision;
    
    private String sensorName;

    private Map<String, Object> coords; // Json format
    
    private Double coordsAccuracy;

    private String service;

    private Double speed;
    
    private Double heading;
    
    private Long timestamp;

    private String deviceId;

    private Long contentTimestamp;
}

那接下来我们要怎样对 MongoDB 进行一些操作呢 ? 在 Spring boot 中也提供 API 给我们使用如下,透过继层 MongoRepository 我们就可以有基本的 CRUD 操作。

@Repository
public interface GnssRepository extends MongoRepository<Gnss, String> {
    @Query("{'deviceId' : ?0 }")
    List<GnssMappingVO> getByDeviceId(@Param("id") String id);
}

以下透过 MongoRepository 进行操作

     @Override
    public List<Gnss> getAllGnss() {
        // basic query
        return gnssRepository.findAll();
    }

    @Override
    public Gnss getById(String id) {
        // basic query
        log.debug("Find Gnss by id:{}", id);
        return gnssRepository.findById(id).orElse(null);
    }

当然也可以使用 mongoTemplate 进行存取操作。

@Override
    public List<GnssMappingVO> getListDeviceIdCustom(String id) {
        // Use Query method
        Query query = new Query();
        query.fields().include("id").include("sensorName").include("coords").include("deviceId"); // like SQL SELECT
        query.addCriteria(Criteria.where("deviceId").is(id)); // WHERE condition
        query.with(Sort.by(Sort.Direction.ASC, "sensorName", "deviceId")); // like SQL ORDER BY
        
        List<Gnss> gnssList = mongoTemplate.find(query, Gnss.class);
        List<GnssMappingVO> res = new ArrayList<>();
        /**
         * 回传资料而外处理
         */
        for (int i=0; i<gnssList.size(); i++){
            GnssMappingVO gnssMappingVO = new GnssMappingVO().builder()
                .id(gnssList.get(i).getId())
                .sensorName(gnssList.get(i).getSensorName())
                .coords(gnssList.get(i).getCoords())
                .deviceId(gnssList.get(i).getDeviceId())
                .build();

                res.add(gnssMappingVO);
        }

        return res;
    }

下面同样是用另一种方式进行存取使用 Aggregates

    @Override
    public List<Gnss> getListByTimestampRangeBson(GnssListRequestVO queryVO) {
        String deviceId_column = "deviceId";
        String timestamp_column = "timestamp";
        String gps_column = "coords";
        /**
         * User Bson query
         */
        Bson bson = Filters.and(Arrays.asList(
                Filters.eq(deviceId_column, queryVO.getQuery().getDeviceId()),
                Filters.gte(timestamp_column, queryVO.getQuery().getStart().getTime()),
                Filters.lte(timestamp_column, queryVO.getQuery().getEnd().getTime()))); // Like Where condition
        Bson match = Aggregates.match(bson);
        Bson sort = Aggregates.sort(Sorts.ascending(timestamp_column)); // sort
        Bson fields = Aggregates.project(Projections.include(deviceId_column, timestamp_column, gps_column)); // Like SELECT

        AggregateIterable<Document> findIterable = mongoTemplate.getCollection(collection).aggregate(Arrays.asList(match, fields, sort));

        Gson gson = new Gson(); // 转 JSON
        JsonWriterSettings settings = JsonWriterSettings.builder()
                .dateTimeConverter(new JsonDateTimeCoverter())
                .int64Converter((value, writer) -> writer.writeNumber(value.toString()))
                .build();
        
        List<Gnss> res = StreamSupport.stream(findIterable.spliterator(), false)
                .map(i -> gson.fromJson(i.toJson(settings), Gnss.class))
                .collect(Collectors.toList());

        return res;
    }

MongoDB 在 Spring boot 中提供了很多好用的 API,当然这些东西都是还要读文件才有的,自干才是王道


<<:  铁人赛 Day28 -- AOS.js -- 滚动到元素的位置时,才开始动画

>>:  Unity自主学习(十四):认识Unity介面(5)

Day 8 Dart语言-函数Function

函数 Dart是一种物件导向的语言,所以函数也是物件且为Function类型。因此Function可...

DAY23-EXCEL统计分析:双因子变异数分析实例

我们可以利用上次相同的题目来做此双因子变异数分析。 某间面包店的面包师傅想研究不同配方做出的面包所销...

CIA-资安的目标

在Wentz Wu网站上说明,CIA是美国法定目标(PUBLIC LAW 107–347—DEC. ...

D1: [漫画]工程师太师了-第1话

工程师太师了: 第1话 杂记: 本来打好主意每天来PO一张图,等我PO完30天,就可以完赛了。 今天...

Day34 ( 游戏设计 ) 射击外星人

射击外星人 教学原文参考:射击外星人 这篇文章会介绍,如何在 Scratch 3 里使用建立分身、移...