Fix config formatting
[gitter.git] / scripts / useful-queries / active-users-by-month.mongo
blobb8cc6e14f0efb0a3f931d1a5f9dab2ddd1b4f40c
1 /**
2  * This script will get a count of all active users and aggregates it by month.
3  * Users we consider active:
4  *  - sent a message during the time period
5  * By default it gets last 6 months (ignoring current month because it's not finished yet) but this 6 month window
6  * can be shifted by any amount of months. This mechanism is mainly here to prevent from running hour long queries on the DB.
7  *
8  * Usage:
9  * `mongo gitter --eval "var skipMonth=6" active-users-by-month.mongo`
10  *
11  * e.g. running this on 25th of November 2019 will result in getting user count for 2018-11 - 2019-04
12  */
13 'use strict';
15 load('./fail-on-master.js');
17 load('./date-time-utils.js');
19 // this is how we pass arguments to this script https://stackoverflow.com/a/10114802/606571
20 // eslint-disable-next-line no-use-before-define
21 var skipMonth = skipMonth || 0;
23 for (var i = 0; i < 6; i++) {
24   var startXMonthsAgo = skipMonth + i;
25   var start = startOfUtcMonth(-1 - startXMonthsAgo);
26   var end = startOfUtcMonth(-startXMonthsAgo);
28   var x = db.chatmessages.aggregate([
29     {
30       $match: {
31         _id: {
32           $lt: createIdForTimestamp(end),
33           $gt: createIdForTimestamp(start)
34         }
35       }
36     },
37     {
38       $group: {
39         _id: '$fromUserId'
40       }
41     },
42     // only users who didn't sign up given month
43     {
44       $match: {
45         _id: {
46           $lt: createIdForTimestamp(start)
47         }
48       }
49     },
50     {
51       $group: {
52         _id: null,
53         count: { $sum: 1 }
54       }
55     }
56   ]);
58   const count = (x.toArray() && x.toArray()[0] && x.toArray()[0].count) || 0;
59   print(tojson({ date: start.toISOString(), count: count }));