java mongodb 并表 group 查询 Bson

对mongodb的使用中,需要将发生额表occr+期初表open表,进行union的并表操作后,再进行group,sum,排序,分页操作。

查询了一番后,mongodb4.4版本后,新增了一个管道符,$unionWith,可以进行类似于sql里的union动作。

我原来的写法,是使用Aggregation,Criteria的类进行构造,然后使用mongotemplate进行查询,奈何寻找了一番,没有在Aggregation里找到,对应unionWith的构造方法。于是,只能转换写法,用最自由,类客户端查询的写法去写,如何读者们知道对应的unionWith构造方法,烦请评论区告知下。

其实mongodb的查询,写熟练了之后,还是挺简单的。

基本上就是这种写法,一系列动作,就是一个数组,每个动作用一个json对象进行包裹。

javascript 复制代码
[{},{},{}]

如果有and 和or的复杂组合查询,就是使用

javascript 复制代码
{"$or":[{filed1:值1,filed2:值1...},{filed1:值2,filed2:值2...}]}
{"$and":[{"$or":...}]}

这种多层级的json去操作,唯一要注意点的,就是层级关系而已。

本质就是json对象+数组的嵌套。

这里讲下unionWith的写法。

客户端的语句里,是如下形态

javascript 复制代码
{
     $unionWith:{
        "coll":"你要合并的集合名称",
        //要合并之前对这张新加入的表的一系列操作
        "pipeline":[{
            $match:{要合并之前对这张新加入的表的操作}
        },{
            $project:{}
        }]
    }
}

最好是在客户端实验过正确结果之后,再去转换成bson。

在客户端我们写查询,键没有带双引号,写json语句的时候,无所谓,都带上问题不大这里贴一下我在java组装union的写法

javascript 复制代码
import org.bson.Document;

List<Document> conditions = new ArrayList<>();

Document matchDoc = Document.parse("和客户端一样的查询json字符串");

conditions.add(matchDoc);

AggregateIterable<Document> resultSet =
        mongoTemplate.getCollection(collectionName).aggregate(conditions);

主要就是使用了MongoCollection<TDocument>接口的下列方法

javascript 复制代码
AggregateIterable<TDocument> aggregate(List<? extends Bson> var1);

最后,贴一下,这种写法,对查询出来数据的处理。

javascript 复制代码
try (MongoCursor<Document> cursor = resultSet.iterator()) {
      while (cursor.hasNext()) {
        JsonObject itemObj = gson.fromJson(cursor.next().toJson(), JsonObject.class);
    }
}

这里我主要是将查出来的document结果,转为了json字符串,再转回我习惯性使用的Gson工具包里的对象,主要是个人觉得这个Document对象太难用了,当然你也可以使用别的json工具包去转为你熟悉的json对象(在java里)

相关推荐
Best_Liu~1 分钟前
SpringBoot全局日期格式化
java·spring boot·后端
少年的范儿11 分钟前
IntelliJ IDEA 配置 JDK 21 与 Maven 教程(Windows):开发环境配置与验证
java·jdk·maven·intellij idea
RuoyiOffice13 分钟前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创
Dwzun31 分钟前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
学长毕设9 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw10 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号11 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠12 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David13 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法