用戶表關(guān)聯(lián)消費(fèi)表
想查詢3個(gè)月未消費(fèi)的用戶
match2的條件
順便請(qǐng)教下 如下這種條件多的 如何優(yōu)化?
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.match2的條件 這個(gè)None是啥意思,如果是想查詢consume這個(gè)字段是否存在,可以改成
{'$match': {'consume': {$exist:true}}}
2.這種優(yōu)化,我曾經(jīng)問過專業(yè)的大神@Mongoing中文社區(qū),我來班門弄斧一下,你這種查詢我猜測會(huì)很慢,但是慢的原因不在于match寫得有問題,而是lookup太慢了,十分影響效率,mongodb是非關(guān)系型數(shù)據(jù)庫,本身設(shè)計(jì)就不想要關(guān)系(我猜的哈),所以lookup和其它查詢關(guān)系的并不是它的強(qiáng)項(xiàng),而且你這里查詢的是消費(fèi)記錄和充值記錄,這兩個(gè)完全是可能不會(huì)更改的數(shù)據(jù),所以我建議是更改數(shù)據(jù)結(jié)構(gòu),將consume和recharge直接存放在這個(gè)user下面,然后不用lookup,直接篩選就可以了,這樣絕對(duì)會(huì)很快,當(dāng)然這前提是在業(yè)務(wù)允許的情況下,修改數(shù)據(jù)結(jié)構(gòu)。
下面貼出我大哥的回答
mongodb的關(guān)聯(lián)查詢$lookup
ps:而且我做過一個(gè)實(shí)驗(yàn),20條數(shù)據(jù)都要lookup的情況下,我查兩次數(shù)據(jù)庫(先查出lookup之前的數(shù)據(jù),再用lookup的根據(jù)(比如說_id)去再查一次數(shù)據(jù)庫,再把這兩者的結(jié)果整合成我想要的數(shù)據(jù))都比直接lookup要快。。。。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。