添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

mongo aggregate操作使用 $lookup,$unwind,$project,$group,$push 操作符,执行多表连接查询,提取多表指定字段,对指定字段进行分组求和得到结果:

db.getCollection('DeviceDetailInfo_20191230').aggregate([
{$lookup:{from:'DeviceDetailInfo_20191229',localField:"deviceId",foreignField:"deviceId",as:"basicInfo"}},
{$unwind:{path: "$basicInfo",preserveNullAndEmptyArrays:false}},
{$project:{_id:false,"bareacode":"$basicInfo.areadcode","bmanufacturer":"$basicInfo.manufacturer","bcountycode":"$basicInfo.countycode",periodic_count:"$periodic_count",subDeviceNumber:"$subDeviceNumber"}},
{$group:{_id:{areacode:"bareacode",manufacturer:"$bmanufacturer",countycode:"$bcountycode"},count1:{"$sum":"$periodic_count"},count2:{"$sum":"$subDeviceNumber"}}}

语句指令说明:

"$lookup":{ //关联查询指令 "from":"DeviceDetailInfo_20191229", //连接目标表 "localField":"deviceId", //本表属性 "foreignField":"deviceId", //目标表属性 "as":"basicInfo" //关联进来的内容放在basicInfo数组中,因为存在一对多的映射所以为数组 "$unwind":{ "path":"$basicInfo", //根据数组每一项拆分成单个文档 "preserveNullAndEmptyArrays":"false" //true:如果匹配到的数组为空输出空文档,fasle:如果匹配到的数组为空不输出文档 "$project":{ //选择默认属性输出 "_id":false, //不自动生成主键 "bareacode":"$basicInfo.areadcode", //指定basicInfo.areadcode字段的别名为bareacode "bmanufacturer":"$basicInfo.manufacturer", "bcountycode":"$basicInfo.countycode", "periodic_count":"$periodic_count", "subDeviceNumber":"$subDeviceNumber", "maxTxRate":"$maxTxRate", "averTxRate":"$averTxRate", "averRxRate":"$averRxRate", "maxRxRate":"$maxRxRate", "wlanRadioPower":"$wlanRadioPower" "$group":{ //对选择出的属性字段进行分组聚合求和 "_id":{ //根据如下属性进行分组并指定字段别名 "areacode":"$bareacode", "manufacturer":"$bmanufacturer", "countycode":"$bcountycode" "subList":{ "$push":{ //对于组内数据。指定属性构建数组结构 "maxTxRate":"$maxTxRate", "averTxRate":"$averTxRate", "averRxRate":"$averRxRate", "maxRxRate":"$maxRxRate", "wlanRadioPower":"$wlanRadioPower" "count1":{ //指定求和结果的别名 "$sum":"$periodic_count" "count2":{ "$sum":"$subDeviceNumber"

使用spring boot 2.x进行mongodb聚合查询使用match,group,unwind,lookup,project算子。
代码示例:先match在group出结果再lookup,unwind到所需字段最后project得到目标结果级,以游标cursor方式输出。

        Criteria criteria = new Criteria();
        MatchOperation match = Aggregation.match(criteria);
        GroupOperation group = Aggregation.group("deviceId").count().as("sum").last("PONRXPOWER")
                .as("ponRxPower").last("ONUTXPOWER").as("onuTxPower").last("actualTime")
                .as("actualTime");
        LookupOperation lookup = Aggregation.lookup("LatestDeviceInfo", "_id", "_id", "basicInfo");
        UnwindOperation unwind = Aggregation.unwind("basicInfo", "arrayIndex", true);
        Fields fields = Fields.fields("_id", "sum", "basicInfo.areacode", "basicInfo.manufacturer",
                "basicInfo.model", "basicInfo.PPPOEUser", "basicInfo.countycode",
                "basicInfo.RoleId", "basicInfo.OnuName", "basicInfo.BrasIP", "basicInfo.OltIP",
                "basicInfo.PonIP", "basicInfo.mac", "basicInfo.hardwareVersion",
                "basicInfo.firmwareVersion", "basicInfo.dpiVersion", "basicInfo.CommunityInfo",
                "basicInfo.emsName", "basicInfo.oltName", "basicInfo.userName201",
                "basicInfo.ponPort", "basicInfo.installaddr", "ponRxPower", "onuTxPower",
                "actualTime");
        ProjectionOperation project = Aggregation.project(fields);
        Aggregation aggregation = TypedAggregation.newAggregation(match, group, lookup, unwind, project);
        List<Document> pipeline = Document.parse(aggregation.toString()) .getList("pipeline", Document.class);
        MongoCursor<Document> cursor = mongoTemplate.getCollection(""collectionName").
                            aggregate(pipeline , Document.class).allowDiskUse(true)
                    .batchSize(1000).maxTime(5, TimeUnit.MINUTES).cursor();
       while (cursor.hasNext()) {
                   //具体业务逻辑
                    mongo aggregate操作使用$lookup,$unwind,$project,$group操作符,执行多表连接查询,提取多表指定字段,对指定字段进行分组求和得到结果:db.getCollection('DeviceDetailInfo_20191230').aggregate([{$lookup:{from:'DeviceDetailInfo_20191229',localField...
				
mongodb使用$switch做条件处理: ''''var userAccess = [ "Book", "Journal article", "Conference paper"]; db.all1000.aggregate([ $project:{ "three_type": 1, //想要保留的字段(three_type) 1 mongodb的聚合是什么 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。 语法:db.集合名称.aggregate({管道:{表达式}}) 2 mongodb的常用管道和表达式 掌握mongodb中管道的语法 掌握mongo
文章目录一。概念二。集合示例准备三。各个操作符的用法1.$lookup2.$match3.$unwind4.$project5.$limit6.$skip7.$group8.$sort 管道的概念 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算
目录一、数据准备二、聚合管道之$project操作示例2.1、查询集合中的数据2.2、$project 可以表示投影操作, 将原始字段投影成指定名称2.3、$project 可以灵活控制输出文档的格式,也可以剔除不需要的字段2.4、$project 可以从嵌套文档中排除字段 一、数据准备 准备数据集,执行脚本 var tags = ["nosql","mongodb","document","developer","popular"]; var types = ["technology","social
$group进行分布查询操作。这个有点类似于我们在 SQL 中的 group by 语法,但是这个可以操作的内容多一些。 官方地址:https://docs.mongodb.com/manual/reference/operator/aggregation/group/index.html
详解MongoDB中的多表关联查询($lookup)管道的概念聚合框架$lookup的功能及语法主要功能基本语法例子说明$unwind的功能及语法例子 你越是认真生活,你的生活就会越美好——弗兰克·劳埃德·莱特 《人生果实》经典语录 mongodb中文文档 mongoose框架文档 管道的概念 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。        MongoDB进行分组统计时如果面对一些比较复杂的计算情况,往往会遇到 shell 脚本过于复杂的问题。而集算器 SPL 语言,则因其有丰富的函数库及易用性恰好能弥补 Mongo 这方面的不足。若想了解更多,请前往乾学院:MongoDB 分组统计!        MongoDB 作为 NoSql 文档型数据库,在全球范围得到广泛的支持与应用。在比较常用的数据库功能中,...
$group 将集合中的文档分组,可用于统计结果_id表示分组的依据,使用某个字段的格式为'$字段'例1:统计男生、女生的总人数db.stu.aggregate([ {$group: _id:'$gender', counter:{$sum:1} Group by null
MongoDB 嵌套结构的数据非常常见, 它通过嵌套子文档,达到一对多的关联关系。但嵌套结构中按分类分组求子文档的数据计算,不能直接通过 $group 聚集运算来实现,需要将嵌套结构解开,由多层嵌套结构变成多条单层结构来计算,由于中间过程的处理,且还要借且其它函数辅助实现输出。下面以集合 order 为例说明,按 category 分组获取 term 的数量并按由大到小的顺序输出。 { category: "movies", terms: [{ term: "movie 1", total: ...