国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MongoDB > 正文

mongodb中按天進(jìn)行聚合查詢(xún)的實(shí)例教程

2020-10-29 18:41:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近在寫(xiě)項(xiàng)目的時(shí)候遇到一個(gè)問(wèn)題,使用mongodb記錄了用例的執(zhí)行結(jié)果,但是在時(shí)間的記錄上使用的是date格式,現(xiàn)在有一個(gè)需求,以天為單位,統(tǒng)計(jì)一下每天成功的用例和失敗的用例,說(shuō)到統(tǒng)計(jì),肯定是要用到聚合查詢(xún),但是如果以date格式的時(shí)間為group依據(jù),那么等同于沒(méi)有分組,因?yàn)樵谟涗浻美臅r(shí)間幾乎不可能同時(shí),今天查閱了一下相關(guān)文檔,可以使用mongodb的$dateToString命令來(lái)完成這個(gè)需求

問(wèn)題來(lái)源

假如我們以如下的數(shù)據(jù)

/* 1 */{ "_id" : ObjectId("5d24c09651a456efbc231669"), "time" : ISODate("2019-07-08T10:12:35.125Z"), "result" : "Pass"}/* 2 */{ "_id" : ObjectId("5d24c09e51a456efbc23166a"), "time" : ISODate("2019-07-08T10:12:36.125Z"), "result" : "Pass"}....../* 10 */{ "_id" : ObjectId("5d24c0d851a456efbc231672"), "time" : ISODate("2019-07-06T10:10:52.125Z"), "result" : "Pass"}/* 11 */{ "_id" : ObjectId("5d24c0e751a456efbc231673"), "time" : ISODate("2019-07-06T10:10:52.125Z"), "result" : "Fail"}

我的預(yù)期結(jié)果是

{'_id': '2019-07-06', 'Pass': 1}
{'_id': '2019-07-06', 'Fail': 2}
{'_id': '2019-07-07', 'Pass': 2}
{'_id': '2019-07-07', 'Fail': 1}
{'_id': '2019-07-08', 'Pass': 2}
{'_id': '2019-07-08', 'Fail': 3}

如果按照以前的聚合方式,通過(guò)$time來(lái)分組,由于每個(gè)時(shí)間都不相同,所以這樣的聚合就相當(dāng)于沒(méi)有聚合

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [  {'$group': {'_id': '$time', 'count': {'$sum': 1}}}, ]for i in G_mongo['test'].aggregate(pipeline): print(i)

得到的結(jié)果

{'_id': datetime.datetime(2019, 7, 6, 10, 10, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 10, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 11, 22, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 6, 10, 10, 52, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 11, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 32, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 11, 22, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 36, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 8, 10, 12, 35, 125000), 'count': 1}
{'_id': datetime.datetime(2019, 7, 7, 10, 10, 22, 125000), 'count': 1}

可以看到,由于$time上的時(shí)間,誰(shuí)和誰(shuí)都不一樣,所以如果以$time為分組對(duì)象的話每個(gè)統(tǒng)計(jì)都是1。

問(wèn)題的解決

在分組的時(shí)候有一個(gè)$dateToString指令,可以將日期格式的值轉(zhuǎn)化為字符串,比如這里因?yàn)樾枨笫且蕴鞛閱挝唬晕覍⑵滢D(zhuǎn)為
%Y-%m-%d的字符串格式,具體的$grouop如下

{'$group': {'_id': {"$dateToString":{'format':'%Y-%m-%d','date':'$time'}}, 'count': {'$sum': 1}}}

$dateToString的說(shuō)明文檔可以訪問(wèn)https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/ 查看,簡(jiǎn)單介紹一個(gè)

{ $dateToString: {  date: <dateExpression>,  format: <formatString>,  timezone: <tzExpression>,  onNull: <expression>} }

它需要四個(gè)參數(shù),只有date參數(shù)是必須的,指定數(shù)據(jù)來(lái)源,format是轉(zhuǎn)化的格式,timezone為時(shí)區(qū),onNull是如果日期值不存在時(shí)返回的值。

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [    # {'$group': {'_id': '$time', 'count': {'$sum': 1}}},    {'$group': {'_id': {"$dateToString":{'format':'%Y-%m-%d','date':'$time'}}, 'count': {'$sum': 1}}}  ]for i in G_mongo['test'].aggregate(pipeline):  print(i)

上面代碼執(zhí)行的結(jié)果如下

{'_id': '2019-07-06', 'count': 2}
{'_id': '2019-07-07', 'count': 3}
{'_id': '2019-07-08', 'count': 5}

這個(gè)看起來(lái)還不錯(cuò),但是離我的目標(biāo)還差一點(diǎn),因?yàn)樗€沒(méi)有按照用例執(zhí)行結(jié)果進(jìn)行分組,再以天進(jìn)行倒序排列

#coding:utf-8from pymongo import MongoClientclient = MongoClient(host=['%s:%s'%("127.0.0.1",27017)])G_mongo = client['test']pipeline = [    # {'$group': {'_id': '$time', 'count': {'$sum': 1}}},    {'$group': {'_id': {'date':{"$dateToString":{'format':'%Y-%m-%d','date':'$time'}},'result':'$result'}, 'count': {'$sum': 1}}},    {'$sort':{"_id.date":-1}}  ]for i in G_mongo['test'].aggregate(pipeline):  print(i)

得到的結(jié)果如下

{'_id': {'date': '2019-07-08', 'result': 'Fail'}, 'count': 3}
{'_id': {'date': '2019-07-08', 'result': 'Pass'}, 'count': 2}
{'_id': {'date': '2019-07-07', 'result': 'Pass'}, 'count': 2}
{'_id': {'date': '2019-07-07', 'result': 'Fail'}, 'count': 1}
{'_id': {'date': '2019-07-06', 'result': 'Fail'}, 'count': 1}
{'_id': {'date': '2019-07-06', 'result': 'Pass'}, 'count': 2}

查看文檔,除了使用$dateToString指令還可以使用$dayOfMonth指令

pipeline = [    {'$group': {'_id': {'date':{"$dayOfMonth":{'date':'$time'}},'result':'$result'}, 'count': {'$sum': 1}}},    {'$sort':{"_id.date":-1}},  ]

但是這個(gè)指令只能適用于單一月份,如果兩個(gè)月就會(huì)有交集,如7月6號(hào)和6月6號(hào)的會(huì)聚合到一起
上面得到的結(jié)果是

{'_id': {'date': 8, 'result': 'Fail'}, 'count': 3}
{'_id': {'date': 8, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 7, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 7, 'result': 'Fail'}, 'count': 1}
{'_id': {'date': 6, 'result': 'Pass'}, 'count': 2}
{'_id': {'date': 6, 'result': 'Fail'}, 'count': 1}

所以需要根據(jù)需求靈活的使用各種指令。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 神池县| 南召县| 房产| 瓮安县| 子长县| 广宗县| 本溪| 鄂托克前旗| 金坛市| 普格县| 万盛区| 旺苍县| 西吉县| 拜城县| 新闻| 凤山市| 襄汾县| 玛沁县| 宁武县| 曲水县| 沙湾县| 上饶市| 临城县| 休宁县| 瓮安县| 棋牌| 耒阳市| 疏附县| 旬邑县| 皮山县| 东莞市| 那曲县| 淄博市| 伽师县| 屯昌县| 岢岚县| 威海市| 富川| 华池县| 常宁市| 淮滨县|