表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和
上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中。不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和总营收金额、总里程数等,因此这篇笔记记录一下怎么得到这些数据。要想获取这些记录我们首先想到的就是先按照车辆ID分组之后再对指定字段求和,可能是先入为主的原因(有了上一篇笔记),我没有按照传统的思路走下去,而是想着看看能不能在上一篇笔记的基础之上得到想要的结果。
我们沿着这条路在分析一下,车辆相关的耗损和营收都可以放到一个字段中。也就是说我们不用分组了,车辆相关的耗损和营收记录都冗余到了车辆信息记录中,那么接下来就是对数组中的某一字段或者多个进行求和了……查了半天并没有找到类似$sum这样的聚合管道可以对数组中的字段求和,不过得益于mongodb管道的强大,用另外一个管道间接实现了这个功能。
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",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944692000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carWastage'
}
},
{
$lookup:{
from:"FormInstace",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944693000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carRevenue'
}
},
{
$addFields: {
carWastageStatistics: {
$reduce: {
input: "$carWastage",
initialValue: {wastageMoney:0},
in: {
wastageMoney:{ $add : ["$$value.wastageMoney", "$$this.1572493552005"] }
}
}
}
}
},
{
$addFields: {
carRevenueStatistics: {
$reduce: {
input: "$carRevenue",
initialValue: {revenueMoney:0,mileage:0},
in: {
revenueMoney:{$add : ["$$value.revenueMoney", "$$this.1572493553005"]},
mileage:{$add : ["$$value.mileage", "$$this.1572493553006"]}
}
}
}
}
}
]);

这次统计查询就查出了某些车辆的总耗损金额和总营收金额、总里程数;只不过将结果放到对象中了(方便统计一个表中的多个字段),但是现在看不到具体的结果,将代码在修改一下,看一下结果
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",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944692000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carWastage'
}
},
{
$lookup:{
from:"FormInstace",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944693000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carRevenue'
}
},
{
$addFields: {
carWastage_Money: {
$reduce: {
input: "$carWastage",
initialValue: 0,
in: { $add : ["$$value", "$$this.1572493552005"] }
}
}
}
},
{
$addFields: {
carRevenue_Money: {
$reduce: {
input: "$carRevenue",
initialValue: 0,
in: { $add : ["$$value", "$$this.1572493553005"] }
}
}
}
},
{
$addFields: {
carRevenue_Mileage: {
$reduce: {
input: "$carRevenue",
initialValue: 0,
in: { $add : ["$$value", "$$this.1572493553006"] }
}
}
}
}
]);

这样就一目了然了。统计结果对不对呢?我们用传统的分组之后再求和在查询一下,将结果做一下对比(顺便记录一下,分组求和)
db.getCollection('FormInstace').aggregate([
{
$match: {
"FormId":"507048044944692000",
"FormItems.key": { $ne: null }
}
},
{
$addFields: {
FormValueObj: {
$arrayToObject: {
$map: {
input: "$FormItems",
as: "field",
in: [ "$$field.key", "$$field.value" ]
}
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
},
{
$match: {
"1572493552001.id": { $in:["1","2","3"]}
}
},
{
$project: {
FormItems:0,
FormValueObj:0
}
},
{
$group:{
_id: "$1572493552001.id",
wastageMoney: { $sum: "$1572493552005"}
}
},
{ $sort : { _id: 1 } }
]);
统计指定车辆的耗损总额
db.getCollection('FormInstace').aggregate([
{
$match: {
"FormId":"507048044944693000",
"FormItems.key": { $ne: null }
}
},
{
$addFields: {
FormValueObj: {
$arrayToObject: {
$map: {
input: "$FormItems",
as: "field",
in: [ "$$field.key", "$$field.value" ]
}
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
},
{
$match: {
"1572493553001.id": { $in:["1","2","3"]}
}
},
{
$project: {
FormItems:0,
FormValueObj:0
}
},
{
$group:{
_id: "$1572493553001.id",
wastageMoney: { $sum: "$1572493553005"},
mileage: { $sum: "$1572493553006"}
}
},
{ $sort : { _id: 1 } }
]);
统计指定车辆的营收总额和里程数

对比两次查询结果,两次不同的统计方式的结果相同。这样就放心了。好了就到这里了。
********************以下是修改补充部分********************
打脸了,好疼,┭┮﹏┭┮……曾记得以前使用$sum对数组中的某一属性求和时没有得到预期的结果,这篇笔记写完之后,打算在按照常规思路($unwind、$group、$sum等)在写一种查询方式,但是但是但是测试的时候发现$sum好使了,写放一下代码
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",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944692000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carWastage'
}
},
{
$lookup:{
from:"FormInstace",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944693000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carRevenue'
}
},
{
$addFields: {
"carWastageStatistics.wastageMoney": { $sum: "$carWastage.1572493552005"},
"carRevenueStatistics.revenueMoney": { $sum: "$carRevenue.1572493553005"},
"carRevenueStatistics.mileage": { $sum: "$carRevenue.1572493553006"}
}
}
]);
在文中第一个查询语句基础上修改
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",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944692000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carWastage'
}
},
{
$lookup:{
from:"FormInstace",
let: { tempMainRelationKey: "$_id" },
pipeline:[
{
$match: {
FormId: "507048044944693000",
"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
}
},
{ $match:
{ $expr:
{ $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
}
},
],
as:'carRevenue'
}
},
{
$addFields: {
"carWastage_Money": { $sum: "$carWastage.1572493552005"},
"carRevenue_Money": { $sum: "$carRevenue.1572493553005"},
"carRevenue_Mileage": { $sum: "$carRevenue.1572493553006"},
}
}
]);
在文中第二个查询语句基础上修改
下面看一下对比图,看一下改动情况


再看一下,执行结果截图


和上面的结果一模一样……对mongodb管道认识不够深入,应用中有需求就是查一下,太片面了,没有验证的东西千万别乱说,切记切记切记!!!特尴尬, ̄□ ̄||
表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和的更多相关文章
- 表单生成器(Form Builder)之mongodb表单数据——整理数据
在上篇笔记中,为车辆信息表.车辆耗损表以及车辆营收表插入了一些数据.之后便是查询了,重点也在查询……按照之前定好的数据结构,如果查询mongodb document的最外层比较简单,但是我们的重点应该 ...
- 表单生成器(Form Builder)之mongodb表单数据查询——关联查询
这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...
- 表单生成器(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 ...
随机推荐
- 【原创】(十三)Linux内存管理之vma/malloc/mmap
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- HDU 2896病毒侵袭
当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开 ...
- String and Arrays
Description 有一个N*N的字符矩阵,从上到下依次记为第1行,第2行,--,第N行,从左至右依次记为第1列,第2列,--,第N列. 对于这个矩阵会进行一系列操作,但这些操作只有两类: ...
- B.Obtain Two Zeroes
题目:包含两个零 题意:你被给予两个数a和b,你可以对这两个数进行操作 每次操作你可以选择任意的正整数x,可以进行a = a - x,b = b - 2x或者a = a - 2x,b = b - x两 ...
- 用Python写一个游戏脚本,你会吗?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:ivat4u 学习python有一段时间了,由于python语言的强大 ...
- centos7下ldap+kerberos实现单点登陆
一. LDAP概念 http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%9 ...
- Kinect-v2 Examples with MS-SDK(译文二)
K2-asset提供的脚本组件 K2-asset在KinectScripts文件夹中提供通用脚本组件,并在KinectDemos / 文件夹的相应脚本子文件夹中提供特定于演示的组件.可以在自己的Uni ...
- Prometheus启动失败的问题
1.yml文件格式错误 Prometheus是开箱即用的,但是我们用的时候因为新增监控项,所以我们需要修改配置文件.改了之后启动不了的话,第一件事就要想的是yaml文件的格式问题. yaml中允许表示 ...
- 《吊打面试官》系列-ConcurrentHashMap & HashTable
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...
- 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...