国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - MongoDB - MongoDB中強大的統計框架Aggregation使用實例解析

MongoDB中強大的統計框架Aggregation使用實例解析

2020-05-04 17:421angxi MongoDB

這篇文章主要介紹了MongoDB中強大的統計框架Aggregation使用實例解析,文中舉了Python和Java使用Aggregation的數據統計例子進行講解,需要的朋友可以參考下

聽說項目里面Aggregation用的多,那就專門針對這個多多練習一下。

基本的操作包括:

•$project - 可以從子文檔中提取字段,可以重命名字段

•$match - 可以實現查找的功能

•$limit - 接受一個數字n,返回結果集中的前n個文檔。

•$skip - 接受一個數字n,丟棄結果集中的前n個文檔。效率比較低,依然會遍歷前n個文檔。

•$unwind - 可以將一個包含數組的文檔切分成多個, 比如你的文檔有 中有個數組字段 A, A中有10個元素, 那么經過 $unwind處理后會產生10個文檔,這些文檔只有 字段 A不同

•$group - 統計操作, 還提供了一系列子命令

–$avg, $sum …

•$sort - 排序

Python篇
實驗一、學生數據統計

1、生成學生數據:

#!/usr/bin/env python
# coding=utf-8
from pymongo import MongoClient
from random import randint
name1 = ["yang ", "li ", "zhou "]
name2 = [
  "chao",
  "hao",
  "gao",
  "qi gao",
  "hao hao",
  "gao gao",
  "chao hao",
  "ji gao",
  "ji hao",
  "li gao",
  "li hao",
]
provinces = [
  "guang dong",
  "guang xi",
  "shan dong",
  "shan xi",
  "he nan"
]
client = MongoClient('localhost', 27017)
db = client.student
sm = db.smessage
sm.remove()
for i in range(1, 100):
  name = name1[randint(0, 2)] + name2[randint(0, 10)]
  province = provinces[randint(0, 4)]
  new_student = {
    "name": name,
    "age": randint(1, 30),
    "province": province,
    "subject": [
      {"name": "chinese", "score": randint(0, 100)},
      {"name": "math", "score": randint(0, 100)},
      {"name": "english", "score": randint(0, 100)},
      {"name": "chemic", "score": randint(0, 100)},
    ]}
  print new_student
  sm.insert_one(new_student)

print sm.count()

好了,現在數據庫里面有100條學生數據了。

現在我要得到廣東學生的平均年齡,在mongo控制臺輸入:

 如果想到得到所有省份的平均年齡,那就更加簡單了:

db.smessage.aggregate(
{$match: {province: "guang dong"}}
)

{ "_id" : "guang xi", "age" : 15.19047619047619 }
{ "_id" : "guang dong", "age" : 16.05263157894737 }
{ "_id" : "shan dong", "age" : 17.44 }
{ "_id" : "he nan", "age" : 20 }
{ "_id" : "shan xi", "age" : 16.41176470588235 }

如果想得到廣東省所有科目的平均成績:

db.smessage.aggregate(
{$match: {province: "guang dong"}},
{$unwind: "$subject"},
{$group: { _id: {province:"$province",sujname:"$subject.name"}, per:{$avg:"$subject.score"}}}
)

加上排序:

db.smessage.aggregate(
{$match: {province: "guang dong"}},
{$unwind: "$subject"},
{$group: { _id: {province:"$province",sujname:"$subject.name"}, per:{$avg:"$subject.score"}}},
{$sort:{per:1}}
)

實驗二、尋找發帖水王
有一個保存著雜志文章的集合,你可能希望找出發表文章最多的那個作者。假設每篇文章被保存為MongoDB中的一個文檔。

1、插入數據

#!/usr/bin/env python
# coding=utf-8
from pymongo import MongoClient
from random import randint


name = [
  'yangx',
  'yxxx',
  'laok',
  'kkk',
  'ji',
  'gaoxiao',
  'laoj',
  'meimei',
  'jj',
  'manwang',
]

title = [
  '123',
  '321',
  '12',
  '21',
  'aaa',
  'bbb',
  'ccc',
  'sss',
  'aaaa',
  'cccc',
]

client = MongoClient('localhost', 30999)
db = client.test
bbs = db.bbs
bbs.remove()
for i in range(1, 10000):
  na = name[randint(0, 9)]
  ti = title[randint(0, 9)]
  newcard = {
    'author': na,
    'title': ti,
  }
  bbs.insert_one(newcard)

print bbs.count()

現在我們擁有了10000條文章數據了。

2、用$project將author字段投射出來

{"$project": {"author":1}}

這個語法與查詢中的字段選擇器比較像:可以通過指定"fieldname" : 1選擇需要投射的字段,或者通過指定"fieldname":0排除不需要的字段。

執行完這個"$project"操作之后,結果集中的每個文檔都會以{"_id" : id, "author" : "authorName"}這樣的形式表示。這些結果只會在內存中存在,不會被寫入磁盤。

3、用group將作者名稱分組

{"group":{"_id":"$author","count":{"$sum":1}}}

這樣就會將作者按照名字排序,某個作者的名字每出現一次,就會對這個作者的"count"加1。

這里首先指定了需要進行分組的字段"author"。這是由"_id" : "$author"指定的。可以將這個操作想象為:這個操作執行完后,每個作者只對應一個結果文檔,所以"author"就成了文檔的唯一標識符("_id")。

第二個字段的意思是為分組內每個文檔的"count"字段加1。注意,新加入的文檔中并不會有"count"字段;這"$group"創建的一個新字段。

執行完這一步之后,結果集中的每個文檔會是這樣的結構:{"_id" : "authorName", "count" : articleCount}。

4、用sort排序

{"$sort" : {"count" : -1}}

這個操作會對結果集中的文檔根據"count"字段進行降序排列。

5、限制結果為前5個文檔

{"$limit" : 5}

這個操作將最終的返回結果限制為當前結果中的前5個文檔。
在MongoDB中實際運行時,要將這些操作分別傳給aggregate()函數:

> db.articles.aggregate({"$project" : {"author" : 1}},
... {"$group" : {"_id" : "$author", "count" : {"$sum" : 1}}},
... {"$sort" : {"count" : -1}},
... {"$limit" : 5}
... )

aggregate()會返回一個文檔數組,其中的內容是發表文章最多的5個作者。

{ "_id" : "yangx", "count" : 1028 }
{ "_id" : "laok", "count" : 1027 }
{ "_id" : "kkk", "count" : 1012 }
{ "_id" : "yxxx", "count" : 1010 }
{ "_id" : "ji", "count" : 1007 }


Java篇

我在db中造了些數據(數據時隨機生成的, 能用即可),沒有建索引,文檔結構如下:

Document結構:

 {
  "_id" : ObjectId("509944545"),
  "province" : "海南",
  "age" : 21,
  "subjects" : [
  {
  "name":"語文",
  "score" : 53
  },
  {
  "name":"數學",
  "score" : 27
  },
  {
  "name":"英語",
  "score" : 35
  }
   ],
  "name" : "劉雨"
 }

     接下來要實現兩個功能:

  1.     統計上海學生平均年齡
  2.     統計每個省各科平均成績

接下來一一道來

統計上海學生平均年齡

從這個需求來講,要實現功能要有幾個步驟: 1. 找出上海的學生. 2. 統計平均年齡 (當然也可以先算出所有省份的平均值再找出上海的)。如此思路也就清晰了

首先上 $match, 取出上海學生

{$match:{'province':'上海'}}

接下來 用 $group 統計平均年齡

{$group:{_id:'$province',$avg:'$age'}}

$avg 是 $group的子命令,用于求平均值,類似的還有 $sum, $max ....
上面兩個命令等價于

select province, avg(age) 
 from student 
 where province = '上海'
 group by province

下面是Java代碼

Mongo m = new Mongo("localhost", 27017);
 DB db = m.getDB("test");
 DBCollection coll = db.getCollection("student");
 
 /*創建 $match, 作用相當于query*/
 DBObject match = new BasicDBObject("$match", new BasicDBObject("province", "上海"));
 
 /* Group操作*/
 DBObject groupFields = new BasicDBObject("_id", "$province");
 groupFields.put("AvgAge", new BasicDBObject("$avg", "$age"));
 DBObject group = new BasicDBObject("$group", groupFields);
 
 /* 查看Group結果 */
 AggregationOutput output = coll.aggregate(match, group); // 執行 aggregation命令
 System.out.println(output.getCommandResult());

輸出結果:

{ "serverUsed" : "localhost/127.0.0.1:27017" ,    
 "result" : [ 
  { "_id" : "上海" , "AvgAge" : 32.09375}
  ] ,     
  "ok" : 1.0
 }

如此工程就結束了,再看另外一個需求

統計每個省各科平均成績

首先更具數據庫文檔結構,subjects是數組形式,需要先‘劈'開,然后再進行統計

主要處理步驟如下:

1. 先用$unwind 拆數組 2. 按照 province, subject 分租并求各科目平均分

$unwind 拆數組

{$unwind:'$subjects'}

按照 province, subject 分組,并求平均分

{$group:{
   _id:{
     subjname:”$subjects.name”,  // 指定group字段之一 subjects.name, 并重命名為 subjname
     province:'$province'     // 指定group字段之一 province, 并重命名為 province(沒變)
   },
   AvgScore:{
    $avg:”$subjects.score”    // 對 subjects.score 求平均
   }
 }

java代碼如下:

Mongo m = new Mongo("localhost", 27017);
 DB db = m.getDB("test");
 DBCollection coll = db.getCollection("student");
 
 /* 創建 $unwind 操作, 用于切分數組*/
 DBObject unwind = new BasicDBObject("$unwind", "$subjects");
 
 /* Group操作*/
 DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("subjname", "$subjects.name").append("province", "$province"));
 groupFields.put("AvgScore", new BasicDBObject("$avg", "$subjects.scores"));
 DBObject group = new BasicDBObject("$group", groupFields);
 
 /* 查看Group結果 */
 AggregationOutput output = coll.aggregate(unwind, group); // 執行 aggregation命令
 System.out.println(output.getCommandResult());

輸出結果

{ "serverUsed" : "localhost/127.0.0.1:27017" , 
  "result" : [ 
   { "_id" : { "subjname" : "英語" , "province" : "海南"} , "AvgScore" : 58.1} , 
   { "_id" : { "subjname" : "數學" , "province" : "海南"} , "AvgScore" : 60.485} ,
   { "_id" : { "subjname" : "語文" , "province" : "江西"} , "AvgScore" : 55.538} , 
   { "_id" : { "subjname" : "英語" , "province" : "上海"} , "AvgScore" : 57.65625} , 
   { "_id" : { "subjname" : "數學" , "province" : "廣東"} , "AvgScore" : 56.690} , 
   { "_id" : { "subjname" : "數學" , "province" : "上海"} , "AvgScore" : 55.671875} ,
   { "_id" : { "subjname" : "語文" , "province" : "上海"} , "AvgScore" : 56.734375} , 
   { "_id" : { "subjname" : "英語" , "province" : "云南"} , "AvgScore" : 55.7301 } ,
   .
   .
   .
   .
   "ok" : 1.0
 }

統計就此結束.... 稍等,似乎有點太粗糙了,雖然統計出來的,但是根本沒法看,同一個省份的科目都不在一起。囧

接下來進行下加強,

支線任務: 將同一省份的科目成績統計到一起( 即,期望 'province':'xxxxx', avgscores:[ {'xxx':xxx}, ....] 這樣的形式)

要做的有一件事,在前面的統計結果的基礎上,先用 $project 將平均分和成績揉到一起,即形如下面的樣子

{ "subjinfo" : { "subjname" : "英語" ,"AvgScores" : 58.1 } ,"province" : "海南" }

再按省份group,將各科目的平均分push到一塊,命令如下:

$project 重構group結果

{$project:{province:"$_id.province", subjinfo:{"subjname":"$_id.subjname", "avgscore":"$AvgScore"}}

$使用 group 再次分組

{$group:{_id:"$province", avginfo:{$push:"$subjinfo"}}}

java 代碼如下:

Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("test");
DBCollection coll = db.getCollection("student");
       
/* 創建 $unwind 操作, 用于切分數組*/
DBObject unwind = new BasicDBObject("$unwind", "$subjects");
       
/* Group操作*/
DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("subjname", "$subjects.name").append("province", "$province"));
groupFields.put("AvgScore", new BasicDBObject("$avg", "$subjects.scores"));
DBObject group = new BasicDBObject("$group", groupFields);
       
/* Reshape Group Result*/
DBObject projectFields = new BasicDBObject();
projectFields.put("province", "$_id.province");
projectFields.put("subjinfo", new BasicDBObject("subjname","$_id.subjname").append("avgscore", "$AvgScore"));
DBObject project = new BasicDBObject("$project", projectFields);
       
/* 將結果push到一起*/
DBObject groupAgainFields = new BasicDBObject("_id", "$province");
groupAgainFields.put("avginfo", new BasicDBObject("$push", "$subjinfo"));
DBObject reshapeGroup = new BasicDBObject("$group", groupAgainFields);
 
/* 查看Group結果 */
AggregationOutput output = coll.aggregate(unwind, group, project, reshapeGroup);
System.out.println(output.getCommandResult());

結果如下:

{ "serverUsed" : "localhost/127.0.0.1:27017" , 
 "result" : [ 
    { "_id" : "遼寧" , "avginfo" : [ { "subjname" : "數學" , "avgscore" : 56.46666666666667} , { "subjname" : "英語" , "avgscore" : 52.093333333333334} , { "subjname" : "語文" , "avgscore" : 50.53333333333333}]} , 
    { "_id" : "四川" , "avginfo" : [ { "subjname" : "數學" , "avgscore" : 52.72727272727273} , { "subjname" : "英語" , "avgscore" : 55.90909090909091} , { "subjname" : "語文" , "avgscore" : 57.59090909090909}]} , 
    { "_id" : "重慶" , "avginfo" : [ { "subjname" : "語文" , "avgscore" : 56.077922077922075} , { "subjname" : "英語" , "avgscore" : 54.84415584415584} , { "subjname" : "數學" , "avgscore" : 55.33766233766234}]} , 
    { "_id" : "安徽" , "avginfo" : [ { "subjname" : "英語" , "avgscore" : 55.458333333333336} , { "subjname" : "數學" , "avgscore" : 54.47222222222222} , { "subjname" : "語文" , "avgscore" : 52.80555555555556}]} 
  .
  .
  .
  ] , "ok" : 1.0}

 

延伸 · 閱讀

精彩推薦
  • MongoDBMongodb實現定時備份與恢復的方法教程

    Mongodb實現定時備份與恢復的方法教程

    這篇文章主要給大家介紹了Mongodb實現定時備份與恢復的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB 內存使用情況分析

    MongoDB 內存使用情況分析

    都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢...

    MongoDB教程網10002020-09-29
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
  • MongoDBMongoDB中javascript腳本編程簡介和入門實例

    MongoDB中javascript腳本編程簡介和入門實例

    作為一個數據庫,MongoDB有一個很大的優勢——它使用js管理數據庫,所以也能夠使用js腳本進行復雜的管理——這種方法非常靈活 ...

    MongoDB教程網6982020-04-24
  • MongoDBMongoDB憑什么躋身數據庫排行前五

    MongoDB憑什么躋身數據庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
  • MongoDB分布式文檔存儲數據庫之MongoDB分片集群的問題

    分布式文檔存儲數據庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數據庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDBmongodb基本命令實例小結

    mongodb基本命令實例小結

    這篇文章主要介紹了mongodb基本命令,結合實例形式總結分析了MongoDB數據庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
  • MongoDB遷移sqlserver數據到MongoDb的方法

    遷移sqlserver數據到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數據到MongoDb的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲成av人片在线观看 | 国产精品第一 | 一级毛片免费完整视频 | 精品国产一区二区三区忘忧草 | 免费的一级毛片 | 久久2| 欧美日韩专区 | 亚洲午夜精品片久久www慈禧 | 久久久久国产一区二区三区四区 | 免费一区二区三区四区 | 久久精品99 | 国产日韩欧美三级 | 日本久久国产 | 国产一区二区在线免费观看 | 国产精品欧美一区二区三区不卡 | 91视频大全 | 欧美一区二区三区久久久久久桃花 | 淫片一级国产 | 毛片在线视频 | 免费一区二区三区四区 | 日本在线免费视频 | 超碰av在线 | 婷婷国产在线观看 | 91久久在线观看 | 日韩特一级| 久久综合九色综合网站 | 欧美女人性 | 国产成人精品免高潮在线观看 | 日韩精品1区 | 伊人网综合 | 日韩在线小视频 | av一区二区三区 | 久久综合久久综合久久综合 | 午夜视频一区二区三区 | 99re在线播放视频 | 久久综合九色综合欧美狠狠 | 国产高清无密码一区二区三区 | 4h影院| 欧美一级看片a免费观看 | 国产目拍亚洲精品99久久精品 | av免费资源 |