SpringBoot整合MongoDB数据库方式(二)

#1.回顾

SpringBoot整合MongoDB数据库方式(一)
上一篇文章写的接口继承的接口,而继承的接口也继承着上级接口,一级一级继承上去,但最终由SpringBoot的容器框架帮助我们实现接口的具体实现,框架是如何实现的我们这里暂时不做说明.有兴趣的可以自己去研究一下.
在这里插入图片描述
接口之间的继承–>注入–>使用

#2.MongoTemplate.class

#2.1体系结构

在这里插入图片描述

#2.2实现接口

在这里插入图片描述

#.2.3注入对象

在这里插入图片描述

#2.4相关方法

save相关方法
在这里插入图片描述
insert相关方法
在这里插入图片描述
update相关方法
在这里插入图片描述
get相关方法:
在这里插入图片描述
upsert相关方法:
在这里插入图片描述
remove相关方法:
在这里插入图片描述
就不一一赘述了,里面这个MongoTemplate类里面3000多行代码,几十上百个方法,几乎涵盖了操作MongoDB数据库的所有方式.就目前来说不会出现你想用而他没有的方法,更多的情况是这个方法已经存在,而你并不知道他的存在.
在这里插入图片描述

#2.5当然,这也是框架给我们提供好的,那么如何扩展自己特定的方法呢.

#3.扩展

#3.1编写接口

在这里插入图片描述

#3.2自己实现自己的接口(达到定制化)

在这里插入图片描述

#3.3 复杂实现

上面这个接口开起来很简单,当然我们还有复杂一点的实现方式,比如下面的具体实现:

/**
     * 复制数据
     *
     * @param tenantId   企业id
     * @param dataId     数据id
     * @param formId     表单id
     * @param copySource 数据复制源
     * @return 复制的结果
     * @author ???
     */
    @Override
    public BaseVO<TableDataVO> copyData(Long tenantId, Long dataId, Long formId, String copySource) {

        List<CopySource> copySources = new ArrayList<>();

        JSONArray jsonArray = JSON.parseArray(copySource);
        for (Object o : jsonArray) {
            JSONObject jsonObject = (JSONObject) o;
            CopySource source = JSON.parseObject(JSON.toJSONString(jsonObject), CopySource.class);
            source.setRowId(jsonObject.getLong("row_id"));
            List<TableRow> tableRowlist = new ArrayList<>();
            JSONArray rowsJson = jsonObject.getJSONArray("table_rows");
            for (Object obj : rowsJson) {
                JSONObject json = (JSONObject) obj;
                TableRow tableRow = new TableRow();
                tableRow.setValue(jsonTransfer.transData(json.getJSONObject(Const.VALUE)));
                tableRowlist.add(tableRow);
            }
            source.setTableRows(tableRowlist);
            copySources.add(source);
        }

        List<Long> copyIds = new ArrayList<>();
        List<TableRow> copyResultRows = new ArrayList<>();

        for (CopySource source : copySources) {
            List<TableRow> tableRows = source.getTableRows();
            for (TableRow tableRow : tableRows) {
                tableRow.setId(snowflakeClient.uniqueId());
                tableRow.setCopySourceId(source.getRowId());
                tableRow.setStatus(DataState.ENABLE);
            }
            copyIds.add(source.getRowId());
            copyResultRows.addAll(source.getTableRows());
        }

        Map.Entry<String, DataBase> sourceDataEntry = null;

        //查询数据库中需要被拆分的数据
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(dataId).and("form_id").is(formId).and("tenant_id").is(tenantId));
        FormData formData = mongoTemplate.findOne(query, FormData.class);

        for (Map.Entry<String, DataBase> entry : formData.getData().entrySet()) {
            if (Const.LIST.equals(entry.getValue().getType())) {
                TableData tableData = (TableData) entry.getValue();
                List<Long> allRows = new ArrayList<>();
                for (TableRow tableRow : tableData.getValue()) {
                    allRows.add(tableRow.getId());
                }
                if (allRows.containsAll(copyIds)) {
                    sourceDataEntry = entry;
                }
            }
        }

        if (sourceDataEntry == null) {
            return null;
        }

        if (!((TableVO) metadataClient.getField(tenantId, formId, sourceDataEntry.getKey())).getCopy()) {
            return null;
        }

        TableData sourceTable = (TableData) sourceDataEntry.getValue();

        for (TableRow tableRow : sourceTable.getValue()) {
            if (copyIds.contains(tableRow.getId())) {
                tableRow.setStatus(DataState.HIDDEN);
            }
        }

        sourceTable.getValue().addAll(copyResultRows);

        formData.getData().put(sourceDataEntry.getKey(), sourceTable);
        formData.setSelectedRows(new ArrayList<>());
        mongoTemplate.save(formData);

        Map<String, DataBaseVO> dataVO = jsonTransfer.transDataVO(tenantId, formData.getCreator(), formId,
                JSON.parseObject(JSON.toJSONString(formData.getData())), formData, null);

        return new BaseVO<>(BaseVO.SUCCESS_CODE, "操作成功", (TableDataVO) dataVO.get(sourceDataEntry.getKey()));
    }

而他的接口如下;
在这里插入图片描述
这和你各自具体的业务相关,mongoDB能干啥,无非就是数据的操作,你把数据拿出来按照一定业务逻辑过滤一遍,然后再存回数据库去,这是一种,业务逻辑各种各样,而基础操作就那么一些

#4其他我想告诉你的

比如下面这个接口:
在这里插入图片描述
具体实现;
在这里插入图片描述
mongoDB中的高级查询

@Override
    public List<FormData> getHistoryVersionInfo(Long tenantId, Long originId, Long grantId, Long formId) {
         //创建查询对象
        Query query = new Query();
        // 添加查询条件
        query.addCriteria(Criteria.where("tenant_id").is(tenantId).and("origin_id").is(originId).and("form_id").is(formId).and("status").ne("DELETE")); 
        // 将查询对象,参数传递进去,利用mongoTemplate的find()方法拿到你想要的数据,
        return mongoTemplate.find(query, FormData.class, Const.COLLECTION_FORM_DATA);
    }

这些需要你对MongoDB数据库有一定的了解,比如ne关键字啊,find()findOne等等起数据库自身的相关内容

#5.两种方式总结

#1. 写自己的接口去继承别人的接口(MongoRepository) 由框架帮我们实现,当然也可以在自己的接口写扩展.
#2. 利用框架已经写好的具体实现类(MongoTemplate),通过注入该类对象,调用该类几乎涵盖了所有操作内容的方法

方法有很多,看你自己喜欢,个人推荐第二种 #2,即注入MongoTemplate,调用其丰富的方法,实现SpringBoot对MongoDB的操作…

#6.Tata…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值