# -*- coding: utf-8 -*- #!/usr/bin/env python #: 升级用户模型 #: 为提升`用户管理`模块的检索性能, 每次在用户完成充值|消费后,在记录充值|消费记录之后,应增加total_recharged|total_consumed字段 #: 为将旧数据兼容,这里做处理 import os import sys import datetime #: current_dir - 2 PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) from script.base import init_env, get_logger init_env(interactive=True) from apps.web.user.models import RechargeRecord, ConsumeRecord, MyUser from apps.web.device.models import Group from apilib.utils_mongo import BulkHandler logger = get_logger(__name__) def insert_user_total_consumed_and_total_recharged(): groups = Group.objects() users = MyUser.objects() start_time = datetime.datetime.now() user_bulk_handler = BulkHandler(MyUser.get_collection()) for group in groups: groupId = str(group.id) for index, user in enumerate(users(groupId=groupId)): logger.info(u'No[%s] updating user(%s)' % (index+1, user.openId,)) total_recharged_amount = float(sum( r.money for r in RechargeRecord.objects(openId=user.openId, groupId=groupId, via='recharge', result='success'))) total_consumed_amount = \ float( sum( r.coin for r in ConsumeRecord.objects(openId=user.openId, groupId=groupId, isNormal=True) )) user_bulk_handler.update(query_dict={ 'groupId': user.groupId, 'openId': user.openId }, update_dict={ '$set':{ 'total_recharged': total_recharged_amount, 'total_consumed': total_consumed_amount }}) logger.info('start bulk update') result = user_bulk_handler.execute() if result['success'] == 0: logger.error('exception = %s' % result['info']) logger.info('finished, time cost=%s' % (datetime.datetime.now() - start_time,)) insert_user_total_consumed_and_total_recharged()