python列表 如何使用 mongodb聚合的类似方法$group筛选

[
     {'_id': ObjectId('5abb4f9ca7e2c54c757b3e48'),
      'amount': 8400,
      'buyerEmail': 'otzYzwMh24edWk8NxSJOqCSZREe0',
      'from': 'weixin',
      'orderDate': datetime.datetime(2018, 3, 28, 8, 17, 28, 940000),
      'orderid': '2018032816173212079',
      'real': 8400,
      'rechargeDate': datetime.datetime(2018, 3, 28, 8, 17, 41, 877000),
      'status': 1,
      'tradeNo': '4200000099201803287230332578',
      'uid': ObjectId('5abb36051a62067bf7e30178')
    },
    {'_id': ObjectId('5b6699f6df03ec3294d7c0a4'),
      'amount': 100,
      'buyerEmail': 'otzYzwC3YwRdu7QrWLXqS3VRJybI',
      'from': 'weixin',
      'orderDate': datetime.datetime(2018, 8, 5, 6, 32, 21, 442000),
      'orderid': '2018080514322245193',
      'real': 100,
      'rechargeDate': datetime.datetime(2018, 8, 5, 6, 33, 0, 381000),
      'status': 1,
      'tradeNo': '4200000148201808052403940202',
      'uid': ObjectId('5a5738411a62061972e128cb')
    },
    .....
]

如何把同一个uid的整合一起,并只显示uid real from rechargeDate的元素?
类似mongodb聚合的$group
理想结果:

[
    {'uid':xxxxxxxxxxxxxxxx:
        [
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
        ]
    },
        {'uid':xxxxxxxxxxxxxxxx:
        [
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
            {
                'real':xxx,
                'from':xxx,
                'recharge':xxx,
            },
        ]
    },
    ...
]
阅读 2.3k
1 个回答

使用python的collections

import json
from collections import defaultdict


def main():
    ret = defaultdict(list)
    data = [
     {'_id': '5abb4f9ca7e2c54c757b3e48',
      'amount': 8400,
      'buyerEmail': 'otzYzwMh24edWk8NxSJOqCSZREe0',
      'from': 'weixin',
      'orderid': '2018032816173212079',
      'real': 8400,
      'status': 1,
      'tradeNo': '4200000099201803287230332578',
      'uid': '5abb36051a62067bf7e30178' # 需要把ObjectId处理成字符串
    },
    {'_id': '5b6699f6df03ec3294d7c0a4',
      'amount': 100,
      'buyerEmail': 'otzYzwC3YwRdu7QrWLXqS3VRJybI',
      'from': 'weixin',
      'orderid': '2018080514322245193',
      'real': 100,
      'status': 1,
      'tradeNo': '4200000148201808052403940202',
      'uid': '5a5738411a62061972e128cb' # 需要把ObjectId处理成字符串
    },
    {'_id': '5b6699f6df03ec3294d7c0a4',
      'amount': 200,
      'buyerEmail': 'otzYzwC3YwRdu7QrWLXqS3VRJybI',
      'from': 'weixin',
      'orderid': '2018080514322245193',
      'real': 200,
      'status': 1,
      'tradeNo': '4200000148201808052403940202',
      'uid': '5a5738411a62061972e128cb' # 需要把ObjectId处理成字符串
    },
    ]
    
    for d in data:
        ret[d.get('uid')].append(d)
        
    print(json.dumps(ret, indent=2))
if __name__ == '__main__':
    main()
    
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题