经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和 - du-blog
来源:cnblogs  作者:du-blog  时间:2019/11/12 12:52:55  对本文有异议

  上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中。不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和总营收金额、总里程数等,因此这篇笔记记录一下怎么得到这些数据。要想获取这些记录我们首先想到的就是先按照车辆ID分组之后再对指定字段求和,可能是先入为主的原因(有了上一篇笔记),我没有按照传统的思路走下去,而是想着看看能不能在上一篇笔记的基础之上得到想要的结果。

  我们沿着这条路在分析一下,车辆相关的耗损和营收都可以放到一个字段中。也就是说我们不用分组了,车辆相关的耗损和营收记录都冗余到了车辆信息记录中,那么接下来就是对数组中的某一字段或者多个进行求和了……查了半天并没有找到类似$sum这样的聚合管道可以对数组中的字段求和,不过得益于mongodb管道的强大,用另外一个管道间接实现了这个功能。

  1. db.getCollection('FormInstace').aggregate([
  2. {
  3. $match: {
  4. "_id": { $in: ["1","2","3"] },
  5. "FormItems.key": { $ne: null }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. FormValueObj: {
  11. $arrayToObject: {
  12. $map: {
  13. input: "$FormItems",
  14. as: "field",
  15. in: [ "$$field.key", "$$field.value" ]
  16. }
  17. }
  18. }
  19. }
  20. },
  21. {
  22. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  23. },
  24. {
  25. $project: {
  26. FormItems:0,
  27. FormValueObj:0
  28. }
  29. },
  30. {
  31. $lookup:{
  32. from:"FormInstace",
  33. let: { tempMainRelationKey: "$_id" },
  34. pipeline:[
  35. {
  36. $match: {
  37. FormId: "507048044944692000",
  38. "FormItems.key": { $ne: null }
  39. }
  40. },
  41. {
  42. $addFields: {
  43. FormValueObj: {
  44. $arrayToObject: {
  45. $map: {
  46. input: "$FormItems",
  47. as: "field",
  48. in: [ "$$field.key", "$$field.value" ]
  49. }
  50. }
  51. }
  52. }
  53. },
  54. {
  55. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  56. },
  57. {
  58. $project: {
  59. FormItems:0,
  60. FormValueObj:0
  61. }
  62. },
  63. { $match:
  64. { $expr:
  65. { $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
  66. }
  67. },
  68. ],
  69. as:'carWastage'
  70. }
  71. },
  72. {
  73. $lookup:{
  74. from:"FormInstace",
  75. let: { tempMainRelationKey: "$_id" },
  76. pipeline:[
  77. {
  78. $match: {
  79. FormId: "507048044944693000",
  80. "FormItems.key": { $ne: null }
  81. }
  82. },
  83. {
  84. $addFields: {
  85. FormValueObj: {
  86. $arrayToObject: {
  87. $map: {
  88. input: "$FormItems",
  89. as: "field",
  90. in: [ "$$field.key", "$$field.value" ]
  91. }
  92. }
  93. }
  94. }
  95. },
  96. {
  97. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  98. },
  99. {
  100. $project: {
  101. FormItems:0,
  102. FormValueObj:0
  103. }
  104. },
  105. { $match:
  106. { $expr:
  107. { $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
  108. }
  109. },
  110. ],
  111. as:'carRevenue'
  112. }
  113. },
  114. {
  115. $addFields: {
  116. carWastageStatistics: {
  117. $reduce: {
  118. input: "$carWastage",
  119. initialValue: {wastageMoney:0},
  120. in: {
  121. wastageMoney:{ $add : ["$$value.wastageMoney", "$$this.1572493552005"] }
  122. }
  123. }
  124. }
  125. }
  126. },
  127. {
  128. $addFields: {
  129. carRevenueStatistics: {
  130. $reduce: {
  131. input: "$carRevenue",
  132. initialValue: {revenueMoney:0,mileage:0},
  133. in: {
  134. revenueMoney:{$add : ["$$value.revenueMoney", "$$this.1572493553005"]},
  135. mileage:{$add : ["$$value.mileage", "$$this.1572493553006"]}
  136. }
  137. }
  138. }
  139. }
  140. }
  141. ]);

  这次统计查询就查出了某些车辆的总耗损金额和总营收金额、总里程数;只不过将结果放到对象中了(方便统计一个表中的多个字段),但是现在看不到具体的结果,将代码在修改一下,看一下结果

  1. db.getCollection('FormInstace').aggregate([
  2. {
  3. $match: {
  4. "_id": { $in: ["1","2","3"] },
  5. "FormItems.key": { $ne: null }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. FormValueObj: {
  11. $arrayToObject: {
  12. $map: {
  13. input: "$FormItems",
  14. as: "field",
  15. in: [ "$$field.key", "$$field.value" ]
  16. }
  17. }
  18. }
  19. }
  20. },
  21. {
  22. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  23. },
  24. {
  25. $project: {
  26. FormItems:0,
  27. FormValueObj:0
  28. }
  29. },
  30. {
  31. $lookup:{
  32. from:"FormInstace",
  33. let: { tempMainRelationKey: "$_id" },
  34. pipeline:[
  35. {
  36. $match: {
  37. FormId: "507048044944692000",
  38. "FormItems.key": { $ne: null }
  39. }
  40. },
  41. {
  42. $addFields: {
  43. FormValueObj: {
  44. $arrayToObject: {
  45. $map: {
  46. input: "$FormItems",
  47. as: "field",
  48. in: [ "$$field.key", "$$field.value" ]
  49. }
  50. }
  51. }
  52. }
  53. },
  54. {
  55. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  56. },
  57. {
  58. $project: {
  59. FormItems:0,
  60. FormValueObj:0
  61. }
  62. },
  63. { $match:
  64. { $expr:
  65. { $eq: [ "$1572493552001.id","$$tempMainRelationKey" ] }
  66. }
  67. },
  68. ],
  69. as:'carWastage'
  70. }
  71. },
  72. {
  73. $lookup:{
  74. from:"FormInstace",
  75. let: { tempMainRelationKey: "$_id" },
  76. pipeline:[
  77. {
  78. $match: {
  79. FormId: "507048044944693000",
  80. "FormItems.key": { $ne: null }
  81. }
  82. },
  83. {
  84. $addFields: {
  85. FormValueObj: {
  86. $arrayToObject: {
  87. $map: {
  88. input: "$FormItems",
  89. as: "field",
  90. in: [ "$$field.key", "$$field.value" ]
  91. }
  92. }
  93. }
  94. }
  95. },
  96. {
  97. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  98. },
  99. {
  100. $project: {
  101. FormItems:0,
  102. FormValueObj:0
  103. }
  104. },
  105. { $match:
  106. { $expr:
  107. { $eq: [ "$1572493553001.id","$$tempMainRelationKey" ] }
  108. }
  109. },
  110. ],
  111. as:'carRevenue'
  112. }
  113. },
  114. {
  115. $addFields: {
  116. carWastage_Money: {
  117. $reduce: {
  118. input: "$carWastage",
  119. initialValue: 0,
  120. in: { $add : ["$$value", "$$this.1572493552005"] }
  121. }
  122. }
  123. }
  124. },
  125. {
  126. $addFields: {
  127. carRevenue_Money: {
  128. $reduce: {
  129. input: "$carRevenue",
  130. initialValue: 0,
  131. in: { $add : ["$$value", "$$this.1572493553005"] }
  132. }
  133. }
  134. }
  135. },
  136. {
  137. $addFields: {
  138. carRevenue_Mileage: {
  139. $reduce: {
  140. input: "$carRevenue",
  141. initialValue: 0,
  142. in: { $add : ["$$value", "$$this.1572493553006"] }
  143. }
  144. }
  145. }
  146. }
  147. ]);

  这样就一目了然了。统计结果对不对呢?我们用传统的分组之后再求和在查询一下,将结果做一下对比(顺便记录一下,分组求和)

  1. db.getCollection('FormInstace').aggregate([
  2. {
  3. $match: {
  4. "FormId":"507048044944692000",
  5. "FormItems.key": { $ne: null }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. FormValueObj: {
  11. $arrayToObject: {
  12. $map: {
  13. input: "$FormItems",
  14. as: "field",
  15. in: [ "$$field.key", "$$field.value" ]
  16. }
  17. }
  18. }
  19. }
  20. },
  21. {
  22. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  23. },
  24. {
  25. $match: {
  26. "1572493552001.id": { $in:["1","2","3"]}
  27. }
  28. },
  29. {
  30. $project: {
  31. FormItems:0,
  32. FormValueObj:0
  33. }
  34. },
  35. {
  36. $group:{
  37. _id: "$1572493552001.id",
  38. wastageMoney: { $sum: "$1572493552005"}
  39. }
  40. },
  41. { $sort : { _id: 1 } }
  42. ]);
统计指定车辆的耗损总额
  1. db.getCollection('FormInstace').aggregate([
  2. {
  3. $match: {
  4. "FormId":"507048044944693000",
  5. "FormItems.key": { $ne: null }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. FormValueObj: {
  11. $arrayToObject: {
  12. $map: {
  13. input: "$FormItems",
  14. as: "field",
  15. in: [ "$$field.key", "$$field.value" ]
  16. }
  17. }
  18. }
  19. }
  20. },
  21. {
  22. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  23. },
  24. {
  25. $match: {
  26. "1572493553001.id": { $in:["1","2","3"]}
  27. }
  28. },
  29. {
  30. $project: {
  31. FormItems:0,
  32. FormValueObj:0
  33. }
  34. },
  35. {
  36. $group:{
  37. _id: "$1572493553001.id",
  38. wastageMoney: { $sum: "$1572493553005"},
  39. mileage: { $sum: "$1572493553006"}
  40. }
  41. },
  42. { $sort : { _id: 1 } }
  43. ]);
统计指定车辆的营收总额和里程数

  对比两次查询结果,两次不同的统计方式的结果相同。这样就放心了。好了就到这里了。

原文链接:http://www.cnblogs.com/du-blog/p/11840660.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号