Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.18 KB | None | 0 0
  1. count = db.coll.count();
  2. db.coll.find().sort( {"a":1} ).skip(count / 2 - 1).limit(1);
  3.  
  4. GroupOperation countByBookOwner = group("owner").count().as("nbBooks");
  5.  
  6. SortOperation sortByCount = sort(Direction.ASC, "nbBooks");
  7.  
  8. GroupOperation putInArray = group().push("nbBooks").as("nbBooksArray");
  9.  
  10. ProjectionOperation getSizeOfArray = project("nbBooksArray").and("nbBooksArray").size().as("size");
  11.  
  12. ProjectionOperation divideSizeByTwo = project("nbBooksArray").and("size").divide(2).as("middleFloat");
  13.  
  14. ProjectionOperation getIntValueOfDivisionForBornLeft = project("middleFloat", "nbBooksArray").and("middleFloat")
  15. .project("trunc").as("beginMiddle");
  16.  
  17. ProjectionOperation add1ToBornLeftToGetBornRight = project("beginMiddle", "middleFloat", "nbBooksArray")
  18. .and("beginMiddle").project("add", 1).as("endMiddle");
  19.  
  20. ProjectionOperation arrayElementAt = project("beginMiddle", "endMiddle", "middleFloat", "nbBooksArray")
  21. .and("nbBooksArray").project("arrayElemAt", "$beginMiddle").as("beginValue").and("nbBooksArray")
  22. .project("arrayElemAt", "$endMiddle").as("endValue");
  23.  
  24. ProjectionOperation averageForMedian = project("beginMiddle", "endMiddle", "middleFloat", "nbBooksArray",
  25. "beginValue", "endValue").and("beginValue").project("avg", "$endValue").as("median");
  26.  
  27. Aggregation aggregation = newAggregation(countByBookOwner, sortByCount, putInArray, getSizeOfArray,
  28. divideSizeByTwo, getIntValueOfDivisionForBornLeft, add1ToBornLeftToGetBornRight, arrayElementAt,
  29. averageForMedian);
  30.  
  31. long time = System.currentTimeMillis();
  32. AggregationResults<MedianContainer> groupResults = mongoTemplate.aggregate(aggregation, "book",
  33. MedianContainer.class);
  34.  
  35. {
  36. "aggregate": "book" ,
  37. "pipeline": [
  38. {
  39. "$group": {
  40. "_id": "$owner" ,
  41. "nbBooks": {
  42. "$sum": 1
  43. }
  44. }
  45. } , {
  46. "$sort": {
  47. "nbBooks": 1
  48. }
  49. } , {
  50. "$group": {
  51. "_id": null ,
  52. "nbBooksArray": {
  53. "$push": "$nbBooks"
  54. }
  55. }
  56. } , {
  57. "$project": {
  58. "nbBooksArray": 1 ,
  59. "size": {
  60. "$size": ["$nbBooksArray"]
  61. }
  62. }
  63. } , {
  64. "$project": {
  65. "nbBooksArray": 1 ,
  66. "middleFloat": {
  67. "$divide": ["$size" , 2]
  68. }
  69. }
  70. } , {
  71. "$project": {
  72. "middleFloat": 1 ,
  73. "nbBooksArray": 1 ,
  74. "beginMiddle": {
  75. "$trunc": ["$middleFloat"]
  76. }
  77. }
  78. } , {
  79. "$project": {
  80. "beginMiddle": 1 ,
  81. "middleFloat": 1 ,
  82. "nbBooksArray": 1 ,
  83. "endMiddle": {
  84. "$add": ["$beginMiddle" , 1]
  85. }
  86. }
  87. } , {
  88. "$project": {
  89. "beginMiddle": 1 ,
  90. "endMiddle": 1 ,
  91. "middleFloat": 1 ,
  92. "nbBooksArray": 1 ,
  93. "beginValue": {
  94. "$arrayElemAt": ["$nbBooksArray" , "$beginMiddle"]
  95. } ,
  96. "endValue": {
  97. "$arrayElemAt": ["$nbBooksArray" , "$endMiddle"]
  98. }
  99. }
  100. } , {
  101. "$project": {
  102. "beginMiddle": 1 ,
  103. "endMiddle": 1 ,
  104. "middleFloat": 1 ,
  105. "nbBooksArray": 1 ,
  106. "beginValue": 1 ,
  107. "endValue": 1 ,
  108. "median": {
  109. "$avg": ["$beginValue" , "$endValue"]
  110. }
  111. }
  112. }
  113. ]
  114.  
  115. db.collection.aggregate([
  116. { "$match": { "processingStatus": "Completed" } },
  117. {
  118. "$group": {
  119. "_id": "$userId",
  120. "valueArray": {
  121. "$push": "$value"
  122. }
  123. }
  124. },
  125. { "$sort": { "value": 1 } },
  126. {
  127. "$project": {
  128. "_id": 0,
  129. "userId": "$_id",
  130. "valueArray": 1,
  131. "size": { "$size": ["$valueArray"] }
  132. }
  133. },
  134. {
  135. "$project": {
  136. "userId": 1,
  137. "valueArray": 1,
  138. "isEvenLength": { "$eq": [{ "$mod": ["$size", 2] }, 0 ] },
  139. "middlePoint": { "$trunc": { "$divide": ["$size", 2] } }
  140. }
  141. },
  142. {
  143. "$project": {
  144. "userId": 1,
  145. "valueArray": 1,
  146. "isEvenLength": 1,
  147. "middlePoint": 1,
  148. "beginMiddle": { "$subtract": [ "$middlePoint", 1] },
  149. "endMiddle": "$middlePoint"
  150. }
  151. },
  152. {
  153. "$project": {
  154. "userId": 1,
  155. "valueArray": 1,
  156. "middlePoint": 1,
  157. "beginMiddle": 1,
  158. "beginValue": { "$arrayElemAt": ["$stepsArray", "$beginMiddle"] },
  159. "endValue": { "$arrayElemAt": ["$stepsArray", "$endMiddle"] },
  160. "isEvenLength": 1
  161. }
  162. },
  163. {
  164. "$project": {
  165. "userId": 1,
  166. "valueArray": 1,
  167. "middlePoint": 1,
  168. "beginMiddle": 1,
  169. "beginValue": 1,
  170. "endValue": 1,
  171. "middleSum": { "$add": ["$beginValue", "$endValue"] },
  172. "isEvenLength": 1
  173. }
  174. },
  175. {
  176. "$project": {
  177. "userId": 1,
  178. "valueArray": 1,
  179. "median": {
  180. "$cond": {
  181. if: "$isEvenLength",
  182. then: { "$divide": ["$middleSum", 2] },
  183. else: { "$arrayElemAt": ["$stepsArray", "$middlePoint"] }
  184. }
  185. }
  186. }
  187. }
  188. ])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement