用户表关联消费表想查询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要快。。。。
添加回答
举报
0/150
提交
取消