mongolabs.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /*
  2. * PROPRIETARY AND CONFIDENTIAL
  3. *
  4. * The contents of this example are proprietary and confidential, and may not be used or distributed without express
  5. * written permission from MongoLab.
  6. *
  7. */
  8. var mongodb = require("mongodb");
  9. var async = require("async");
  10. var ObjectId = mongodb.ObjectID;
  11. //mongodb.Logger.setLevel("debug");
  12. var uri = process.env.MONGODB_URI;
  13. function log(s) {
  14. console.log(new Date().toISOString() + " " + s);
  15. }
  16. log("Connecting...");
  17. mongodb.MongoClient.connect(
  18. uri,
  19. {
  20. replSet: {
  21. //poolSize: 10
  22. socketOptions: {
  23. connectTimeoutMS: 60 * 1000
  24. }
  25. }
  26. },
  27. function (err, db) {
  28. if (err) {
  29. log("Error trying to connect.");
  30. log(err.stack);
  31. } else {
  32. log("Connected.");
  33. db.serverConfig.on('joined', function(t, s) {
  34. log("joined :: " + t + " :: " + s.name);
  35. });
  36. db.serverConfig.on('left', function(t, s) {
  37. log("joined :: " + t + " :: " + s.name);
  38. });
  39. db.serverConfig.on('timeout', function(err) {
  40. log("timeout :: ");
  41. log(err.stack);
  42. });
  43. log("Running aggregations...");
  44. async.forEachOf(
  45. aggregations,
  46. function (item, i, cb) {
  47. log("Running aggregation " + i + "...");
  48. db.collection(item.collection).aggregate(item.pipeline, function (err, result) {
  49. if (err) {
  50. log("Error running aggregation " + i + ".");
  51. log(err.stack)
  52. } else {
  53. log("Done running aggregation " + i + ".");
  54. }
  55. cb();
  56. });
  57. },
  58. function (err) {
  59. if (err) {
  60. log("Untrapped error.");
  61. log(err.stack);
  62. } else {
  63. log("Finished running all aggregations.")
  64. }
  65. log("Closing database...");
  66. db.close();
  67. }
  68. )
  69. }
  70. }
  71. );
  72. var aggregations = [
  73. // ========== 1 ==========
  74. {
  75. collection: "tlogs",
  76. pipeline: [
  77. {
  78. "$match": {
  79. "_type": "tlog",
  80. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  81. "businessDate": {
  82. "$gte": ISODate("2015-11-01T00:00:00.000+0000"),
  83. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  84. }
  85. }
  86. },
  87. {
  88. "$unwind": "$order"
  89. },
  90. {
  91. "$unwind": "$order.orderedOffers"
  92. },
  93. {
  94. "$redact": {
  95. "$cond": {
  96. "if": {
  97. "$not": "$order.orderedOffers.onTheHouse"
  98. },
  99. "then": "$$KEEP",
  100. "else": "$$PRUNE"
  101. }
  102. }
  103. },
  104. {
  105. "$redact": {
  106. "$cond": {
  107. "if": {
  108. "$not": "$order.orderedOffers.cancellation"
  109. },
  110. "then": "$$KEEP",
  111. "else": "$$PRUNE"
  112. }
  113. }
  114. },
  115. {
  116. "$group": {
  117. "_id": "$order.orderedOffers.offer",
  118. "offer": {
  119. "$first": "$order.orderedOffers.offer"
  120. },
  121. "menu": {
  122. "$first": "$order.orderedOffers.menu"
  123. },
  124. "totalAmount": {
  125. "$sum": "$order.orderedOffers.amount"
  126. },
  127. "totalCount": {
  128. "$sum": NumberInt(1)
  129. },
  130. "totalDiners": {
  131. "$sum": "$diners"
  132. }
  133. }
  134. }
  135. ]
  136. },
  137. // ========== 2 ==========
  138. {
  139. collection: "tlogs",
  140. pipeline: [
  141. {
  142. "$match": {
  143. "_type": "tlog",
  144. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  145. "businessDate": {
  146. "$gte": ISODate("2015-11-01T00:00:00.000+0000"),
  147. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  148. }
  149. }
  150. },
  151. {
  152. "$unwind": "$order"
  153. },
  154. {
  155. "$unwind": "$order.orderedItems"
  156. },
  157. {
  158. "$redact": {
  159. "$cond": {
  160. "if": {
  161. "$not": "$order.orderedItems.onTheHouse"
  162. },
  163. "then": "$$PRUNE",
  164. "else": "$$KEEP"
  165. }
  166. }
  167. },
  168. {
  169. "$group": {
  170. "_id": {
  171. "category": "$order.orderedItems.category"
  172. },
  173. "totalItems": {
  174. "$sum": NumberInt(1)
  175. },
  176. "totalAmount": {
  177. "$sum": "$order.orderedItems.price"
  178. }
  179. }
  180. }
  181. ]
  182. },
  183. // ========== 3 ==========
  184. {
  185. collection: "tlogs",
  186. pipeline: [
  187. {
  188. "$match": {
  189. "_type": "tlog",
  190. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  191. "businessDate": {
  192. "$gte": ISODate("2015-11-01T00:00:00.000+0000"),
  193. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  194. },
  195. "order": {
  196. "$elemMatch": {
  197. "onTheHouse": null
  198. }
  199. }
  200. }
  201. },
  202. {
  203. "$unwind": "$order"
  204. },
  205. {
  206. "$unwind": "$order.tips"
  207. },
  208. {
  209. "$project": {
  210. "_id": "$order.tips._id",
  211. "tableTip": {
  212. "$cond": [
  213. {
  214. "$eq": [
  215. {
  216. "$size": {
  217. "$setIntersection": [
  218. "$order.tableIds",
  219. [
  220. ObjectId("53eb1ee4e6c77111203d852e"),
  221. ObjectId("53eb1ee4e6c77111203d852f"),
  222. ObjectId("53eb1ee4e6c77111203d8530"),
  223. ObjectId("53eb1ee4e6c77111203d8531"),
  224. ObjectId("53eb1ee4e6c77111203d8532"),
  225. ObjectId("53eb1ee4e6c77111203d8533"),
  226. ObjectId("53eb1ee4e6c77111203d8534"),
  227. ObjectId("53eb1ee4e6c77111203d8535"),
  228. ObjectId("53eb1ee4e6c77111203d8536"),
  229. ObjectId("53eb1ee4e6c77111203d8537"),
  230. ObjectId("53eb1ee4e6c77111203d8538"),
  231. ObjectId("53eb1ee4e6c77111203d8539"),
  232. ObjectId("53eb1ee4e6c77111203d853a"),
  233. ObjectId("53eb1ee4e6c77111203d853b"),
  234. ObjectId("53eb1ee4e6c77111203d853c"),
  235. ObjectId("53eb1ee4e6c77111203d853d"),
  236. ObjectId("53eb1ee4e6c77111203d853e"),
  237. ObjectId("53eb1ee4e6c77111203d853f"),
  238. ObjectId("53eb1ee4e6c77111203d8540"),
  239. ObjectId("53eb1ee4e6c77111203d8541"),
  240. ObjectId("53eb1ee4e6c77111203d8542"),
  241. ObjectId("53eb1ee4e6c77111203d8543"),
  242. ObjectId("53eb1ee4e6c77111203d8544"),
  243. ObjectId("53eb1ee4e6c77111203d8545"),
  244. ObjectId("53eb1ee4e6c77111203d8546"),
  245. ObjectId("53eb1ee4e6c77111203d8547"),
  246. ObjectId("53eb1ee4e6c77111203d8548"),
  247. ObjectId("53eb1ee4e6c77111203d8549"),
  248. ObjectId("53eb1ee4e6c77111203d854a"),
  249. ObjectId("53eb1ee4e6c77111203d854b"),
  250. ObjectId("53eb1ee4e6c77111203d854c"),
  251. ObjectId("53eb1ee4e6c77111203d854d"),
  252. ObjectId("53eb1ee4e6c77111203d854e"),
  253. ObjectId("53eb1ee4e6c77111203d854f"),
  254. ObjectId("53eb1ee4e6c77111203d8550"),
  255. ObjectId("53eb1ee4e6c77111203d8551"),
  256. ObjectId("53eb1ee4e6c77111203d8552"),
  257. ObjectId("53eb1ee4e6c77111203d8553"),
  258. ObjectId("53eb1ee4e6c77111203d8554"),
  259. ObjectId("53eb1ee4e6c77111203d8555")
  260. ]
  261. ]
  262. }
  263. },
  264. NumberInt(0)
  265. ]
  266. },
  267. false,
  268. true
  269. ]
  270. },
  271. "amount": "$order.tips.amount"
  272. }
  273. },
  274. {
  275. "$group": {
  276. "_id": "$tableTip",
  277. "tableTip": {
  278. "$first": "$tableTip"
  279. },
  280. "totalAmount": {
  281. "$sum": "$amount"
  282. },
  283. "totalCount": {
  284. "$sum": NumberInt(1)
  285. }
  286. }
  287. }
  288. ]
  289. },
  290. // ========== 4 ==========
  291. {
  292. collection: "tlogs",
  293. pipeline: [
  294. {
  295. "$match": {
  296. "_type": "tlog",
  297. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  298. "businessDate": {
  299. "$gte": ISODate("2015-11-01T00:00:00.000+0000"),
  300. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  301. }
  302. }
  303. },
  304. {
  305. "$unwind": "$order"
  306. },
  307. {
  308. "$group": {
  309. "_id": {
  310. "orderType": "$order.orderType"
  311. },
  312. "orderType": {
  313. "$first": "$order.orderType"
  314. },
  315. "diners": {
  316. "$sum": "$diners"
  317. },
  318. "totalCount": {
  319. "$sum": NumberInt(1)
  320. }
  321. }
  322. }
  323. ]
  324. },
  325. // 5, 6, and 7 deleted by Akira just to reduce character count within this JIRA comment.
  326. // ========== 8 ==========
  327. {
  328. collection: "tlogs",
  329. pipeline: [
  330. {
  331. "$match": {
  332. "_type": "tlog",
  333. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  334. "businessDate": {
  335. "$gte": ISODate("2015-10-01T00:00:00.000+0000"),
  336. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  337. }
  338. }
  339. },
  340. {
  341. "$unwind": "$order"
  342. },
  343. {
  344. "$unwind": "$order.orderedItems"
  345. },
  346. {
  347. "$redact": {
  348. "$cond": {
  349. "if": {
  350. "$and": [
  351. {
  352. "$not": "$order.orderedItems.cancellation"
  353. },
  354. {
  355. "$not": "$order.orderedItems.onTheHouse"
  356. }
  357. ]
  358. },
  359. "then": "$$KEEP",
  360. "else": "$$KEEP"
  361. }
  362. }
  363. },
  364. {
  365. "$unwind": "$order.orderedItems.selectedModifiers"
  366. },
  367. {
  368. "$group": {
  369. "_id": {
  370. "category": "$order.orderedItems.category"
  371. },
  372. "totalAmount": {
  373. "$sum": "$order.orderedItems.selectedModifiers.price"
  374. }
  375. }
  376. }
  377. ]
  378. },
  379. // ========== 9 ==========
  380. {
  381. collection: "tlogs",
  382. pipeline: [
  383. {
  384. "$match": {
  385. "_type": "tlog",
  386. "organization": ObjectId("53eb1ee2e6c77111203d8503"),
  387. "businessDate": {
  388. "$gte": ISODate("2015-10-01T00:00:00.000+0000"),
  389. "$lt": ISODate("2015-11-28T23:59:59.999+0000")
  390. },
  391. "order.orderType": "Refund"
  392. }
  393. },
  394. {
  395. "$unwind": "$order"
  396. },
  397. {
  398. "$unwind": "$order.payments"
  399. },
  400. {
  401. "$group": {
  402. "_id": null,
  403. "totalCount": {
  404. "$sum": NumberInt(1)
  405. },
  406. "totalAmount": {
  407. "$sum": "$order.payments.amount"
  408. }
  409. }
  410. }
  411. ]
  412. }
  413. ];
  414. function ISODate(x) {
  415. return new Date(x);
  416. }
  417. function NumberInt(x) {
  418. return x;
  419. }