Fix config formatting
[gitter.git] / scripts / useful-queries / user-engagement-by-user-type.mongo
blobe80f9ad3c1820e7d71f783a808c5e96851f21033
1 rs.slaveOk()
2 load('./csv.js');
4 function createIdForTimestampString(timestamp) {
5   var hexSeconds = Math.floor(timestamp/1000).toString(16);
7   while(hexSeconds.length < 8) {
8     hexSeconds = "0" + hexSeconds;
9   }
10   return ObjectId(hexSeconds + "0000000000000000");
13 function aggregate(start, end) {
14   return db.chatmessages.aggregate([{
15     $match: {
16       _id: {
17         $lt: createIdForTimestampString(end),
18         $gt: createIdForTimestampString(start)
19       },
20       sent: { $type: 'date' }
21     }
22   }, {
23     $group: {
24       _id: '$fromUserId',
25       days: {
26         $addToSet: { $dayOfYear: '$sent' }
27       },
28       rooms: {
29         $addToSet: '$toTroupeId'
30       },
31       count: { $sum: 1 }
32     },
33   }, {
34     $project: {
35       _id: 1,
36       days: { $size: '$days' },
37       rooms: { $size: '$rooms' },
38       count: 1,
39     },
40   }]);
44 function findSignups(start,end) {
45   return db.users.find({
46     _id: {
47       $lt: createIdForTimestampString(end),
48       $gt: createIdForTimestampString(start)
49     },
50   })
51   .toArray();
54 var endP1 = new Date('2016-10-01T00:00:00Z');
55 var startP1 = new Date('2016-09-01T00:00:00Z');
56 var startP0 = new Date('2016-08-01T00:00:00Z');
58 var gh = [];
59 var tw = [];
60 var engageHash = {};
61 aggregate(startP1, endP1).forEach(function(d) {
62   engageHash[d._id] = d;
63 });
65 findSignups(startP0, startP1).forEach(function(d) {
66   var engagement = engageHash[d._id];
67   // if (!engagement) return;
69   if (d.username.indexOf('_twitter') >= 0) {
70     tw.push(engagement || {})
71   } else {
72     gh.push(engagement || {});
73   }
76 function sum(c) {
77   return function(memo, v) {
78     return memo + (v && v[c] || 0);
79   };
82 var twTotalDays = tw.reduce(sum('days'), 0);
83 var ghTotalDays = gh.reduce(sum('days'),0);
85 printjson({
86   twitter: {
87     count: tw.length,
88     avgEngagedDays: twTotalDays/tw.length,
89   },
90   github: {
91     count: gh.length,
92     avgEngagedDays: ghTotalDays/gh.length,
94   }