node-mongo-demo

node.js and mongodb demo

git clone https://9o.is/git/node-mongo-demo.git

lucky7-leaderboard.js

(2941B)


      1 export const TOP_10_STREAKS = [{
      2     $sort: {
      3         userId: 1,
      4         rollAt: -1,
      5     }
      6 },
      7 {
      8     $addFields: {
      9         win: {
     10             $cond: [
     11                 {
     12                     $eq: [
     13                         {
     14                             $sum: "$roll"
     15                         },
     16                         7
     17                     ]
     18                 },
     19                 true,
     20                 false
     21             ]
     22         }
     23     }
     24 },
     25 {
     26     $group: {
     27         _id: '$userId',
     28         bets: {
     29             $push: '$$ROOT'
     30         }
     31     }
     32 },
     33 {
     34     $project: {
     35         result: {
     36             $reduce: {
     37                 input: '$bets',
     38                 initialValue: {
     39                     streaks: [],
     40                     currentStreak: 0
     41                 },
     42                 in: {
     43                     streaks: {
     44                         $cond: [{
     45                             $eq: ['$$this.win', true]
     46                         },
     47                             '$$value.streaks',
     48                             {
     49                                 $cond: [{
     50                                     $gt: [
     51                                         '$$value.currentStreak',
     52                                         0
     53                                     ]
     54                                 },
     55                                     {
     56                                         $concatArrays: [
     57                                             '$$value.streaks',
     58                                             [
     59                                                 '$$value.currentStreak'
     60                                             ]
     61                                         ]
     62                                     },
     63                                     '$$value.streaks'
     64                                 ]
     65                             }
     66                         ]
     67                     },
     68                     currentStreak: {
     69                         $cond: [{
     70                             $eq: ['$$this.win', true]
     71                         },
     72                             {
     73                                 $add: [
     74                                     '$$value.currentStreak',
     75                                     1
     76                                 ]
     77                             },
     78                             0
     79                         ]
     80                     }
     81                 }
     82             }
     83         }
     84     }
     85 },
     86 {
     87     $project: {
     88         streak: {
     89             $cond: [{
     90                 $gt: ['$result.currentStreak', 0]
     91             },
     92                 {
     93                     $concatArrays: [
     94                         '$result.streaks',
     95                         ['$result.currentStreak']
     96                     ]
     97                 },
     98                 '$result.streaks'
     99             ]
    100         }
    101     }
    102 },
    103 {
    104     $unwind: '$streak'
    105 },
    106 {
    107     $sort: {
    108         streak: -1
    109     }
    110 },
    111 {
    112     $limit: 10
    113 },
    114 {
    115     $lookup: {
    116         from: 'users',
    117         localField: '_id',
    118         foreignField: '_id',
    119         as: 'users'
    120     }
    121 }];
    122