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

用户表关联消费表
想查询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)

泛舟湖上清波郎朗
浏览 570回答 1
1回答

白板的微信

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

相关分类

Python