表单生成器(Form Builder)之mongodb表单数据查询——关联查询
这一篇接着记录一下查询相关的操作。想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理。车辆、耗损、营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询。mongodb 3.2+中开始支持关联查询,下面介绍一下写关联查询的过程。
测试一、
db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    {
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        }
    }
]);

结合前面笔记的成果和官方文档写了第一个关联查询,这次查询跑了300s直接累死了,于是我便介绍了一下数量。
测试二、
db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "_id":{$in:["1","2","3"]},
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    {
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        }
    }
]);


这次总算没有报错,但是耗时也够长的(十多秒);关联数据(RelationData)确实是查出来了,但是该数组中的关联数据还是原来的数据结构。那么我们是不是同样可以将关联数据中的表单项的值也放到最外层,答案是可以的。
测试三、
db.getCollection('FormInstace').aggregate([
    {
        $match: {
            "_id":{$in:["1","2","3"]},
            "FormItems.key": { $ne: null }
        }
    },
    {
        $addFields: {
            FormValueObj: {
                $arrayToObject: {
                    $map: {
                        input: "$FormItems",
                        as: "field",
                        in: [ "$$field.key", "$$field.value" ]
                    }
                }
            }
        }
    },
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
    },
    {
        $project: {
            FormItems:0,
            FormValueObj:0
        }
    },
    {
        $lookup:{
            from:"FormInstace",
            localField:'_id',
            foreignField:'FormItems.value.id',
            as:'RelationData'
        }
    },
    {
        $addFields:{
            RelationData:{
                 $map:
                 {
                    input: "$RelationData",
                    as: "tr",
                    in: {
                        $arrayToObject:{
                            $map:
                             {
                               input:{
                                   $concatArrays: [
                                   [
                                        {key:"_id",value:"$$tr._id"},
                                        {key:"ExtendData",value:"$$tr.ExtendData"},
                                        {key:"CreateUserId",value:"$$tr.CreateUserId"},
                                        {key:"CreateUserName",value:"$$tr.CreateUserName"},
                                        {key:"CreateDate",value:"$$tr.CreateDate"},
                                        {key:"LastModifyDate",value:"$$tr.LastModifyDate"},
                                        {key:"FormId",value:"$$tr.FormId"},
                                        {key:"FormVersion",value:"$$tr.FormVersion"},
                                   ],
                                   "$$tr.FormItems" ]
                               },
                               as: "field",
                               in: ["$$field.key","$$field.value"]
                            }
                        }
                    }
                 }
            }
        }
    }
]);


这个查询得到了我们想要的效果,但是这个关联查询太费劲了,不单是代码一大推,并且还要处理关联数据(RelationData)的结构……因为所有的数据都放在同一张表中,之前我们处理过这张表,现在还要处理一遍,不太情愿
表单生成器(Form Builder)之mongodb表单数据查询——关联查询的更多相关文章
- 表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和
		
上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中.不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和 ...
 - 表单生成器(Form Builder)之mongodb表单数据——整理数据
		
在上篇笔记中,为车辆信息表.车辆耗损表以及车辆营收表插入了一些数据.之后便是查询了,重点也在查询……按照之前定好的数据结构,如果查询mongodb document的最外层比较简单,但是我们的重点应该 ...
 - 表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数
		
上一篇笔记将开始定义的存储结构处理了一下,将FormItems数组中的表单项都拿到mongodb document的最外层,和以前的关系型数据类似,之不过好多列都是动态的,不固定,不过这并没有什么影响 ...
 - 表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照
		
前几天记录了一下表单生成器(Form Builder)之表单数据存储结构mongodb篇,之后便想着伪造一些数据.为什么要伪造数据呢?说来惭愧,因为拖拉拽设计表单以及表单对应的列表的PC端和移动端该显 ...
 - 表单生成器(Form Builder)之伪造表单数据mongodb篇
		
这篇文章终于回到了正轨:为mongodb伪造数据.之前的随机数.随机车牌照.随机时间还有这篇笔记中的获取指定长度的中文字符串,都是为这篇笔记做准备.看一下我们的准备(基础代码) // 1.获取指定范围 ...
 - 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间
		
为了伪造一些尽量真实的假数据,也真是够费劲的.上一篇笔记记录了一下获取一个随机车辆牌照,这篇笔记记录一下怎么获取一个随机时间.这篇就不说那么多废话了,直接上代码 // 获取指定范围的随机数 var g ...
 - 表单生成器(Form Builder)之表单数据存储结构mongodb篇
		
从这篇笔记开始,记录一下表单生成器(Form Builder)相关的一些东西,网上关于他的介绍有很多,这里就不解释了. 开篇说一下如何存储Form Builder生成的数据.
 - Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法
		
Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...
 - 表单组件 form  fastadmin(生成表单元素)
		
Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...
 
随机推荐
- HDU1944 S-NIM(多个NIM博弈)
			
Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as ...
 - CoderForces-913-C
			
A New Year party is not a New Year party without lemonade! As usual, you are expecting a lot of gues ...
 - 深入学习 OLED Adafruit_SSD1306库(8266+arduino)
			
QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷 单片机菜鸟博哥CSDN 1.前言 SSD1306屏幕驱动库,最出名应该就是u8g2,读者可以参考 玩转u ...
 - Postman 关联接口测试(带有token鉴权)
			
Postman 关联接口测试(带有token鉴权) 一.登陆接口 创建一个request请求 在Tests中添加JavaScript代码,用来获取鉴权 pm.test("V2", ...
 - 【Vuejs】335-(超全) Vue 项目性能优化实践指南
			
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
 - 每周一练 之 数据结构与算法(Set)
			
这是第四周的练习题,五一放假结束,该收拾好状态啦. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与算法(LinkedList) 2.每周一练 之 ...
 - LAMP两种模式
			
[LAMP] Linux(Centos)LAMP环境搭建,LAMP源码安装及LAMP架构原理详解 Wish_亮关注2人评论9469人阅读2018-08-20 01:33:10 本章blog主要介绍 ...
 - VS2017 无法修改代码编辑区的项背景颜色问题
			
以前都是好好的,安装 ClaudiaIDE: https://github.com/buchizo/ClaudiaIDE 之后也没啥问题,用着用着代码编辑区自定义的颜色就没有了,好几台电脑都是这样, ...
 - Python使用openpyxl操作excel表格
			
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 ht ...
 - LAMPSecurity: CTF6 Vulnhub Walkthrough
			
镜像下载地址: https://www.vulnhub.com/entry/lampsecurity-ctf6,85/ 主机扫描: ╰─ nmap -p- -sV -oA scan 10.10.202 ...