最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年07月10日 10:58:08   作者:楊彥星  
這篇文章主要給大家介紹了關(guān)于mongodb中按天進(jìn)行聚合查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mongodb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在寫項(xiàng)目的時(shí)候遇到一個(gè)問(wèn)題,使用mongodb記錄了用例的執(zhí)行結(jié)果,但是在時(shí)間的記錄上使用的是date格式,現(xiàn)在有一個(gè)需求,以天為單位,統(tǒng)計(jì)一下每天成功的用例和失敗的用例,說(shuō)到統(tǒng)計(jì),肯定是要用到聚合查詢,但是如果以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-8

from pymongo import MongoClient

client = 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)樾枨笫且蕴鞛閱挝?,所以我將其轉(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-8

from pymongo import MongoClient

client = 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-8

from pymongo import MongoClient

client = 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ì)腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • MongoDB對(duì)Document(文檔)的插入、刪除及更新

    MongoDB對(duì)Document(文檔)的插入、刪除及更新

    這篇文章介紹了MongoDB對(duì)Document(文檔)的插入、刪除及更新,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • mongodb如何對(duì)文檔內(nèi)數(shù)組進(jìn)行過(guò)濾的方法步驟

    mongodb如何對(duì)文檔內(nèi)數(shù)組進(jìn)行過(guò)濾的方法步驟

    這篇文章主要介紹了mongodb如何對(duì)文檔內(nèi)數(shù)組進(jìn)行過(guò)濾的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • JavaScript按日期查詢MongoDB中的數(shù)據(jù)的要點(diǎn)示例

    JavaScript按日期查詢MongoDB中的數(shù)據(jù)的要點(diǎn)示例

    這篇文章主要介紹了JavaScript按日期查詢MongoDB中數(shù)據(jù)的要點(diǎn)示例,MongoDB所支持的BSON有JSON沒(méi)有的一些數(shù)據(jù)類型,如Date和BinData類型,需要的朋友可以參考下
    2016-03-03
  • 優(yōu)化MongoDB配置來(lái)提高CPU使用率

    優(yōu)化MongoDB配置來(lái)提高CPU使用率

    MongoDB作為NoSQL數(shù)據(jù)庫(kù)的一種,已經(jīng)成為新一代數(shù)據(jù)存儲(chǔ)系統(tǒng)的趨勢(shì),然而,MongoDB數(shù)據(jù)服務(wù)的性能問(wèn)題一直是亟待解決的關(guān)鍵問(wèn)題之一,在許多基于MongoDB的利用中,CPU利用率是一個(gè)重要的指標(biāo),它可以幫助我們對(duì)服務(wù)器的性能進(jìn)行實(shí)時(shí)監(jiān)控,以便及時(shí)發(fā)現(xiàn)和修復(fù)效力瓶頸
    2024-01-01
  • CentOS 7系統(tǒng)下SELinux阻止MongoDB啟動(dòng)的問(wèn)題詳解

    CentOS 7系統(tǒng)下SELinux阻止MongoDB啟動(dòng)的問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于CentOS 7系統(tǒng)下SELinux阻止MongoDB啟動(dòng)問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • SpringBoot集成Mongodb的操作方法

    SpringBoot集成Mongodb的操作方法

    本文介紹了MongoDB的基本概念、Docker安裝步驟、SpringBoot整合MongoDB的方法,以及MongoRepository和MongoTemplate的區(qū)別,感興趣的朋友一起看看吧
    2024-11-11
  • Navicat Premium連接mongodb詳細(xì)教程

    Navicat Premium連接mongodb詳細(xì)教程

    這篇文章主要介紹了Navicat Premium連接mongodb詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • MongoDB入門教程之分片技術(shù)詳解

    MongoDB入門教程之分片技術(shù)詳解

    這篇文章主要介紹了MongoDB入門教程之分片技術(shù)詳解,分片是mongodb中的另一種集群技術(shù),需要的朋友可以參考下
    2014-08-08
  • 記一次MongoDB性能問(wèn)題(從MySQL遷移到MongoDB)

    記一次MongoDB性能問(wèn)題(從MySQL遷移到MongoDB)

    最近忙著把一個(gè)項(xiàng)目從MySQL遷移到MongoDB,在導(dǎo)入舊數(shù)據(jù)的過(guò)程中,遇到了些許波折,犯了不少錯(cuò)誤,但同時(shí)也學(xué)到了不少知識(shí),遂記錄下來(lái),需要的朋友可以參考下
    2017-03-03
  • 詳解MongoDB管理命令

    詳解MongoDB管理命令

    MongoDB是一個(gè)NoSQL數(shù)據(jù)庫(kù)系統(tǒng):一個(gè)數(shù)據(jù)庫(kù)可以包含多個(gè)集合(Collection),每個(gè)集合對(duì)應(yīng)于關(guān)系數(shù)據(jù)庫(kù)中的表;而每個(gè)集合中可以存儲(chǔ)一組由列標(biāo)識(shí)的記錄,列是可以自由定義的,非常靈活,由一組列標(biāo)識(shí)的實(shí)體的集合對(duì)應(yīng)于關(guān)系數(shù)據(jù)庫(kù)表中的行
    2016-01-01

最新評(píng)論

南宫市| 平顺县| 紫金县| 赫章县| 衢州市| 哈巴河县| 讷河市| 海伦市| 张家口市| 三台县| 革吉县| 甘孜| 手机| 汉源县| 资溪县| 崇义县| 和林格尔县| 光泽县| 平湖市| 顺昌县| 临海市| 西和县| 灵武市| 特克斯县| 台江县| 唐海县| 广南县| 广南县| 武鸣县| 山阳县| 盱眙县| 丹巴县| 普兰店市| 仲巴县| 平原县| 锡林郭勒盟| 南汇区| 万宁市| 电白县| 岐山县| 陵水|