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