import mongoose from 'mongoose' import * as dotenv from 'dotenv' const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' dotenv.config({ path: envFile }) console.log(process.env.DB_MAIN) import { ActivityChest } from 'models/ActivityChest' import { ScoreRecord } from 'models/ScoreRecord' import { DeleteRecord } from 'models/DeleteRecord' import { rankKey, updateRank, updateRankInvite } from 'services/rank.svr' import { ZRedisClient } from 'zutils' import { RANK_SCORE_SCALE } from 'common/Constants' const db = mongoose.connection const totalKey = 'uaw_activity:score' const keyInvite = `uaw_activity:invite` const updateRedis = async (activity, user, score) => { await updateRank(totalKey, score, user) } const updateRedisInvite = async (activity, sourceUser, user, score) => { await updateRankInvite(keyInvite, parseInt(score * RANK_SCORE_SCALE + ''), `${sourceUser}_${user}`) } const updateRedis2 = (key, vals) => { return new Promise((resolve, reject) => { new ZRedisClient().pub.zadd(key, vals, function (err, res) { if (err) { reject(err) } else { resolve(res) } }) }) } ;(async () => { try { let records = await ScoreRecord.aggregate([{ $group: { _id: '$user', count: { $sum: '$score' } } }]) console.time('first') // _id, count console.log('records: ', records.length) let opts = { url: process.env.REDIS } new ZRedisClient(opts) let vals = [] for (let i = 0, l = records.length; i < l; i++) { const score = parseInt(records[i].count * 100 + '') let totalScoreStr = await new ZRedisClient().zscore(totalKey, records[i]._id) let totalScore = parseInt(totalScoreStr + '') if (score != totalScore) { if (Math.abs(score - totalScore) > 1) { console.log(`user: ${records[i]._id}, score: ${score}, redis: ${totalScore}`) await new ZRedisClient().zincrby(totalKey, score - totalScore, records[i]._id) } } if (i % 1000 === 0) { console.log(i) } } console.timeEnd('first') } catch (e) { console.log(e) } console.log('end') process.exit(0) })()