为了账号安全,请及时绑定邮箱和手机立即绑定

Pymongo 聚合查询条件不在表内的情况的方法。

Pymongo 聚合查询条件不在表内的情况的方法。

泛舟湖上清波郎朗 2019-02-18 16:08:36
用户表关联消费表想查询3个月未消费的用户match2的条件顺便请教下 如下这种条件多的 如何优化? match0 = {'$match': {'regDate': {'$gte': day_30, '$lt': today}}} match1 = {'$match': {'consume.consumeDate': {'$gte': day_180, '$lte': today}}} match2 = {'$match': {'consume': None}} match3 = {'$match': {'recharge.rechargeDate': {'$gte': day_30, '$lte': today}}} match4 = {'$match': {'recharge.tradeNo': {'$ne': ''}}} lookup1 = {'$lookup': { 'from': 'consume', 'localField': '_id', 'foreignField': 'uid', 'as': 'consume' }} lookup2 = {'$lookup': { 'from': 'recharge', 'localField': '_id', 'foreignField': 'uid', 'as': 'recharge' }} project = {'$project': { '_id': 1, 'regDate': 1, 'consume.amount': 1, 'consume.consumeDate': 1, 'recharge.real': 1, 'recharge.from': 1, 'recharge.rechargeDate': 1 }} group = {'$group': { '_id': { '_id': '$_id', } }} pipeline = [match0, lookup1, lookup2, match1, match2, match3, match4, project, group] result = col_user.aggregate(pipeline) LossUser = 0 for _ in result: LossUser = LossUser + 1 print(LossUser)
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

1.match2的条件 这个None是啥意思,如果是想查询consume这个字段是否存在,可以改成

{'$match': {'consume': {$exist:true}}}

2.这种优化,我曾经问过专业的大神@Mongoing中文社区,我来班门弄斧一下,你这种查询我猜测会很慢,但是慢的原因不在于match写得有问题,而是lookup太慢了,十分影响效率,mongodb是非关系型数据库,本身设计就不想要关系(我猜的哈),所以lookup和其它查询关系的并不是它的强项,而且你这里查询的是消费记录和充值记录,这两个完全是可能不会更改的数据,所以我建议是更改数据结构,将consume和recharge直接存放在这个user下面,然后不用lookup,直接筛选就可以了,这样绝对会很快,当然这前提是在业务允许的情况下,修改数据结构。
下面贴出我大哥的回答
mongodb的关联查询$lookup
ps:而且我做过一个实验,20条数据都要lookup的情况下,我查两次数据库(先查出lookup之前的数据,再用lookup的根据(比如说_id)去再查一次数据库,再把这两者的结果整合成我想要的数据)都比直接lookup要快。。。。

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 569 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信