# coding=utf-8 import sys import os import datetime import time from base import init_env env = sys.argv[1] os.environ.setdefault('DJANGO_SETTINGS_MODULE', env) init_env(interactive=False) from apps.web.user.models import MyUser from apps.web.agent.models import Agent from apps.web.device.models import Group from apilib.utils_datetime import to_datetime def test(pageSize, pageIndex, sortKey="last_login", sortOrder="des", isNew=False, startTime="2019-11-18", endTime="2019-11-17", searchKey=None): ownerId = "5b5e96538732d617d228588b" groupIds = Group.get_group_ids_of_dealer_and_partner(ownerId=ownerId) # 获取用户默认头像 default_avatar = Agent.get_agent("5b1dfe024864d01678b57990").get("productLogo") sortFilters = {sortKey: -1 if sortOrder == "des" else 1} groupFilters = { "_id": "$openId", "balance": {"$sum": "$balance"}, "total_recharged": {"$sum": "$total_recharged"}, "total_consumed": {"$sum": "$total_consumed"}, "nickname": {"$first": "$nickname"}, "sex": {"$first": "$sex"}, "avatar": {"$first": "$avatar"}, } projectFilters = {"_id": 0, "openId": "$_id", "balance": 1, "total_recharged": 1, "total_consumed": 1, "nickname": 1, "sex": 1, "avatar": 1} matchFilters = { "groupId": {"$in": groupIds} } if startTime: startDataTime = to_datetime(startTime + ' 00:00:00', "%Y-%m-%d %H:%M:%S") now = datetime.datetime.now() if not endTime: endDateTime = now + datetime.timedelta(days=1) else: endDateTime = to_datetime(endTime, "%Y-%m-%d") if endDateTime > now: endDateTime = now endDateTime = endDateTime + datetime.timedelta(days=1) if startDataTime >= endDateTime: endDateTime = startDataTime + datetime.timedelta(days=1) timeFilters = { "$gte": startDataTime, "$lt": endDateTime } if isNew: timeKey = "dateTimeAdded" else: timeKey = "last_login" matchFilters.update({ timeKey: timeFilters }) if searchKey: matchFilters.update({ "$or": [ {"openId": {"$regex": "%s" % searchKey}}, {"nickname": {"$regex": "%s" % searchKey}} ] }) sTime = time.time() users = MyUser.get_collection().aggregate([ {"$match": matchFilters}, {"$project": {"_id": 1, "openId": 1, "balance": 1, "total_recharged": 1, "total_consumed": 1, "nickname": 1, "sex": 1, "avatar": 1}}, {"$group": groupFilters}, # {"$project": projectFilters}, # {"$sort": sortFilters}, # {"$skip": (pageIndex - 1) * pageSize}, # {"$limit": pageSize} ]) # pipeline = [ # {"$match": matchFilters}, # {"$group": groupFilters}, # {"$sort": sortFilters}, # {"$skip": (pageIndex - 1) * pageSize}, # {"$limit": pageSize} # ] # from pprint import pprint # pprint(MyUser._get_db().command("aggregate", "MyUser", pipeline=pipeline, explain=True)) users = list(users) for user in users: if not user["avatar"]: user["avatar"] = default_avatar eTime = time.time() return eTime - sTime if __name__ == '__main__': print test(20, 2)