Skip to content

Instantly share code, notes, and snippets.

@jmnsf
Created September 28, 2015 15:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmnsf/83f307faeff515fb1392 to your computer and use it in GitHub Desktop.
Save jmnsf/83f307faeff515fb1392 to your computer and use it in GitHub Desktop.
Second and Third day retention calculator from seen_at and first_seen_at in MongoDB Aggregation FW
User.disk_aggregate([
{ '$match' => { '$and' => [
{ 'attrs.first_seen_at' => { '$gte' => DateTime.parse('2015-06-01') } },
{ 'attrs.first_seen_at' => { '$lte' => DateTime.parse('2015-06-30 23:59') } }] } },
{ '$project' => {
days_seen_at: { '$map'=> {
input: '$attrs.seen_at',
as: 'date',
in: { '$dayOfYear' => '$$date' } } },
fsa: { '$dayOfYear' => '$attrs.first_seen_at' },
uid: '$attrs.unique_id',
_id: 0
} },
{ '$unwind' => '$days_seen_at' },
{ '$project' => {
uid: 1,
second_day: { '$let' => {
vars: { day_fsa: { '$add' => ['$fsa', 1] } },
'in' => { '$cond' => {
'if' => { '$eq' => ['$$day_fsa', '$days_seen_at'] }, then: 1, else: 0
} } } },
third_day: { '$let' => {
vars: { day_fsa: { '$add' => ['$fsa', 2] } },
'in' => { '$cond' => {
'if' => { '$eq' => ['$$day_fsa', '$days_seen_at'] }, then: 1, else: 0
} }
} } } },
{ '$group' => {
_id: '$uid',
second_day: { '$max' => '$second_day' },
third_day: { '$max' => '$third_day' }
} },
{ '$group' => {
_id: nil,
second_day: { '$sum' => '$second_day' },
third_day: { '$sum' => '$third_day' }
}}
])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment