免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

MongoDB分組統(tǒng)計(jì)-創(chuàng)新互聯(lián)

MongoDB 在進(jìn)行分組統(tǒng)計(jì)時(shí)如果面對(duì)一些比較復(fù)雜的計(jì)算情況,往往會(huì)遇到 shell 腳本過于復(fù)雜的問題。而集算器 SPL 語言,則因其有豐富的函數(shù)庫及易用性恰好能彌補(bǔ) Mongo 這方面的不足。

創(chuàng)新互聯(lián)是專業(yè)的靈璧網(wǎng)站建設(shè)公司,靈璧接單;提供做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行靈璧網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

 MongoDB 作為 NoSql 文檔型數(shù)據(jù)庫,在全球范圍得到廣泛的支持與應(yīng)用。在比較常用的數(shù)據(jù)庫功能中,相對(duì)于普通的增刪改查,使用 group 聚合分組統(tǒng)計(jì)有些復(fù)雜,而 MongoDB 也給予了支持。本文將對(duì)MongoDb分組的實(shí)現(xiàn)方法及示例進(jìn)行分析,通過在 MongoDB 腳本中操作、使用集算器 SPL 語言操作兩種操作途徑,進(jìn)行簡單的歸納總結(jié)。具體的問題場景包括以下幾個(gè)方面:

1. 內(nèi)嵌數(shù)組結(jié)構(gòu)的統(tǒng)計(jì)........................................................................... 1
2. 內(nèi)嵌文檔求和..................................................................................... 2
3. 分段分組結(jié)構(gòu)統(tǒng)計(jì).............................................................................. 4
4. 多字段分組統(tǒng)計(jì)................................................................................. 6

1. 內(nèi)嵌數(shù)組結(jié)構(gòu)的統(tǒng)計(jì)

對(duì)嵌套數(shù)組結(jié)構(gòu)中的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)處理例如查詢考試科目的平均分及每個(gè)學(xué)生的總成績:

測試數(shù)據(jù):

_idnamesexScroe
1TomF[{"lesson":" Physics","mark":60  },
 {"lesson":" Chemical","mark":72 }]
2JerryM[{"lesson":" Physics","mark":92  },
 {"lesson":" Math","mark":81 }]

期待統(tǒng)計(jì)結(jié)果:

Physics76
Tom132
Chemical72
Jerry173
Math81


Mongodb腳本:

db.student.aggregate( [
 {$unwind : "$scroe"},
{$group: {
 "_id":  {"lesson":"$scroe.lesson"} ,
 "qty":{"$avg": "$scroe.mark"}
 }
}
] )

db.student.aggregate( [
 {$unwind : "$scroe"},
{$group: {
 "_id": {"name"  :"$name"} ,
 "qty":{"$sum" :  "$scroe.mark"}
 }
}
 ] )

由于各科分?jǐn)?shù) scroe 是按課目、成績記錄的數(shù)組結(jié)構(gòu),統(tǒng)計(jì)前需要將它拆解,將每科成績與學(xué)生對(duì)應(yīng),然后再實(shí)現(xiàn)分組計(jì)算。這需要熟悉 unwind 與 group 組合的應(yīng)用。

SPL 腳本 (student.dfx):


AB
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")
2=mongo_shell(A1,"student.find()").fetch()
3=A2.conj(scroe).groups(lesson:LESSON;avg(mark):AVG)
4=A2.new(name:NAME,scroe.sum(mark):TOTAL)
5>A1.close()

按課目統(tǒng)計(jì)的總分?jǐn)?shù):

LESSONAVG
Chemical72.0
Math81.0
Physics76.0

每個(gè)學(xué)生的總成績:

NAMETOTAL
Tom132
Jerry173

腳本說明:
       A1:連接 mongodb 數(shù)據(jù)庫。
       A2:獲取 student 表中的數(shù)據(jù)。
       A3:將 scroe 數(shù)據(jù)合并成序表,再按課程分組,計(jì)算平均分。
       A4:統(tǒng)計(jì)每個(gè)學(xué)生的成績后返回列名為 NAME、TOTAL 的序表。new 函數(shù)表示生成新序表。
       A5:關(guān)閉數(shù)據(jù)庫連接。


       這個(gè)嵌套結(jié)構(gòu)統(tǒng)計(jì)的例子比較常見,相信很多人都遇到過,需要先拆解再分組計(jì)算,主要是熟悉 mongodb 對(duì)嵌套數(shù)據(jù)結(jié)構(gòu)的處理。

2. 內(nèi)嵌文檔求和

對(duì)內(nèi)嵌文檔中的數(shù)據(jù)求和處理, 例如統(tǒng)計(jì)下面每條記錄中 income,output 的數(shù)量和。
測試數(shù)據(jù):

_idincomeoutput
1{"cpu":1000, "mem":500,  "mouse":"100"}{"cpu":1000, "mem":600 ,"mouse":"120"}
2{"cpu":2000, "mem":1000,
 "mouse":"50","mainboard":500 }
{"cpu":1500, "mem":300}

期待統(tǒng)計(jì)結(jié)果:

_id

income

output

1

1600

1720

2

3550

1800

Mongodb腳本:

var fields = [ "income", "output"];
db.computer.aggregate([ 
  { 
     $project:{ 
        "values":{ 
           $filter:{ 
              input:{ 
                  "$objectToArray":"$$ROOT"
              },
              cond:{ 
                 $in:[ 
                    "$$this.k",
                    fields
                 ]
              }
           }
        }
     }
  },
  { 
     $unwind:"$values"
  },
  { 
     $project:{ 
        key:"$values.k",
        values:{ 
           "$sum":{ 
              "$let":{ 
                 "vars":{ 
                    "item":{ 
                        "$objectToArray":"$values.v"
                    }
                 },
                  "in":"$$item.v"
              }
           }
        }
     }
  },
  {$sort: {"_id":-1}},
  { "$group": {
   "_id": "$_id",
   'income':{"$first":  "$values"},
   "output":{"$last":  "$values"}
   }},
]);

filter將income,output 部分信息存放到數(shù)組中,用 unwind 拆解成記錄,再累計(jì)各項(xiàng)值求和,按 _id 分組合并數(shù)據(jù)。

SPL腳本:


AB
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")
2=mongo_shell(A1,"computer.find()").fetch()
3=A2.new(_id:ID,income.array().sum():INCOME,output.array().sum():OUTPUT)
4>A1.close()

統(tǒng)計(jì)結(jié)果

IDINCOMEOUTPUT
11600.01720.0
23550.01800.0

腳本說明:
      A1:連接數(shù)據(jù)庫
      A2:獲取 computer 表中的數(shù)據(jù)
      A3:將 income、output 字段中的數(shù)據(jù)分別轉(zhuǎn)換成序列求和,再與 ID 組合生成新序表
      A4:關(guān)閉數(shù)據(jù)庫連接。


      獲取子記錄的字段值,然后求和,相對(duì)于 mongo 腳本簡化了不少。這個(gè)內(nèi)嵌文檔與內(nèi)嵌數(shù)組在組織結(jié)構(gòu)上有點(diǎn)類似,不小心容易混淆,因此需要特別注意與上例中的 scroe 數(shù)組結(jié)構(gòu)比較,寫出的腳本有所不同。

3. 分段分組結(jié)構(gòu)統(tǒng)計(jì)

統(tǒng)計(jì)各段內(nèi)的記錄數(shù)量。例如下面按銷售量分段,統(tǒng)計(jì)各段內(nèi)的數(shù)據(jù)量,數(shù)據(jù)如下:

_idNAMESTATESALES
1AshleyNew York11000
2RachelMontana9000
3EmilyNew York8800
4MatthewTexas8000
5AlexisIllinois14000

分段方法:0-3000;3000-5000;5000-7500;7500-10000;10000 以上。

期望結(jié)果:

Segmentnumber
33
42

Mongo 腳本

var a_count=0;
var b_count=0;
var c_count=0;
var d_count=0;
var e_count=0;
db.sales.find({
}).forEach(
   function(myDoc) {
       if (myDoc.SALES <3000)  {
           a_count += 1;
       }
       else if (myDoc.SALES <5000)  {
           b_count += 1;
       }
       else if (myDoc.SALES  <7500) {
           c_count += 1;
       }
       else if (myDoc.SALES  <10000) {
           d_count += 1;
       }
       else {
           e_count += 1;
       }       
   }
   );
   
print("a_count="+a_count)
print("b_count="+b_count)
print("c_count="+c_count)
print("d_count="+d_count)
print("e_count="+e_count)


這個(gè)需求按條件分段分組,mongodb 沒有提供對(duì)應(yīng)的 api,實(shí)現(xiàn)起來有點(diǎn)繁瑣,上面的程序是其中實(shí)現(xiàn)的一個(gè)例子參考,當(dāng)然也可以寫成其它實(shí)現(xiàn)形式。下面看看集算器腳本的實(shí)現(xiàn)。

SPL腳本:


AB
1[3000,5000,7500,10000,15000]
2=mongo_open("mongodb://127.0.0.1:27017/raqdb")
3=mongo_shell(A2,"sales.find()").fetch()
4=A3.groups(A1.pseg(int(~.SALES)):Segment;count(1):  number)
5>A2.close()

腳本說明:
       A1:定義 SALES 分組區(qū)間。
       A2:連接 mongodb 數(shù)據(jù)庫。
       A3:獲取 sales 表中的數(shù)據(jù)。
       A4:根據(jù) SALES 區(qū)間分組統(tǒng)計(jì)員工數(shù)。其中函數(shù) pseg()表示返回成員在序列中的區(qū)段序號(hào),int() 表示轉(zhuǎn)換成整數(shù)。
       A5:關(guān)閉數(shù)據(jù)庫連接。


      Mongodb腳本與 SPL 腳本都實(shí)現(xiàn)了預(yù)期的結(jié)果,但函數(shù)pseg 的使用讓 SPL 腳本精簡了不少。

4. 多字段分組統(tǒng)計(jì)

統(tǒng)計(jì)分類項(xiàng)下的總數(shù)及各子項(xiàng)數(shù)。下面統(tǒng)計(jì)按 addr 分類的 book 的數(shù)量以及其下不同 book 類型的數(shù)量。

addrbook
address1book1
address2book1
address1book5
address3book9
address2book5
address2book1
address1book1
address15book1
address4book3
address5book1
address7book11
address1book1

期望結(jié)果:

_idTotalbooksCount
address14book13


book51
address151book11
address23book12


book51
address31book91
address41book31
address51book11
address71book111

Mongo腳本

db.books.aggregate([
   {  "$group": {
        "_id": {
            "addr": "$addr",
            "book": "$book"
       },
        "bookCount": {"$sum": 1}
   }},
   {  "$group": {
        "_id": "$_id.addr",
        "books": {
            "$push": {
                "book": "$_id.book",
                "count": "$bookCount"
           },
       },
        "count": {"$sum": "$bookCount"}
   }},
   {"$sort":  { "count": -1} },
   {  "$project": {
        "books": {"$slice": [ "$books", 2] },
        "count": 1
   }}
]).pretty()

先按 addr,book 分組統(tǒng)計(jì) book 數(shù),再按 addr 分組統(tǒng)計(jì) book 數(shù),調(diào)整顯示順序。

SPL腳本 (books.dfx):


AB
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")
2=mongo_shell(A1,"books.find()")
3=A2.groups(addr,book;count(book):  Count)
4=A3.groups(addr;sum(Count):Total)
5=A3.join(addr,A4:addr,Total)return A5
6>A1.close()

計(jì)算結(jié)果:

AddressbookCountTotal
address1book134
address1book514
address15book111
address2book123
address2book513
address3book911
address4book311
address5book111
address7book1111

腳本說明:
        A1:連接 mongodb 數(shù)據(jù)庫。
        A2:獲取 books 表中的數(shù)據(jù)。
        A3:按 addr,book 分組統(tǒng)計(jì) book 數(shù)顧。
        A4:再按 addr 分組統(tǒng)計(jì) book 數(shù)。
        A5:將 A4 中的 Total 按 addr 關(guān)聯(lián)后合并到序表中。
        B5: 返回序表 A5。
        A6:關(guān)閉數(shù)據(jù)庫連接。


        這個(gè)例子中的 SPL 腳本除了一如既往的精簡清晰外,還顯示了如何簡單方便地與 Java 程序集成。

        在 Java 程序中如果要對(duì) MongoDB 實(shí)現(xiàn)上面的分組統(tǒng)計(jì)功能,需要根據(jù)不同的需求重新一五一十地實(shí)現(xiàn),比較麻煩的同時(shí)也不通用。而如果用集算器來實(shí)現(xiàn)就容易多了,集算器提供了 JDBC 驅(qū)動(dòng)程序,支持在 Java 程序中用 JDBC 存儲(chǔ)過程方式訪問計(jì)算結(jié)果,調(diào)用方法與調(diào)用存儲(chǔ)過程相同。(JDBC 具體配置參考《集算器教程》中的“JDBC基本使用”章節(jié))
       Java 調(diào)用主要過程如下:
       public void testStudent (){
             Connection con = null;
             com.esproc.jdbc.InternalCStatement st;
       try{
            // 建立連接
            Class.forName("com.esproc.jdbc.InternalDriver");
            con= DriverManager.getConnection("jdbc:esproc:local://");
            //調(diào)用存儲(chǔ)過程,其中books是 dfx 的文件名
            st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call books ()");
            //執(zhí)行存儲(chǔ)過程
            st.execute();
            // 獲取結(jié)果集
            ResultSet rs = st.getResultSet();
             。。。。。。。
       catch(Exception e){
            System.out.println(e);
       }


       可以看到,集算器的計(jì)算結(jié)果能夠很方便地供 Java 應(yīng)用程序使用。除了上面的調(diào)用方式,程序也可以修改成直接加載 SPL 腳本的函數(shù),用 SPL 腳本文件名當(dāng)參數(shù)來實(shí)現(xiàn)。同時(shí),集算器也支持 ODBC 驅(qū)動(dòng),與其它支持 ODBC 的語言集成也與此類似。

       簡單總結(jié)一下,MongoDB 的聚合分組計(jì)算的操作與存儲(chǔ)文檔的結(jié)構(gòu)息息相關(guān),豐富的文檔結(jié)構(gòu)一方面有利于存儲(chǔ),同時(shí)數(shù)據(jù)查詢展示也可以做到多樣化,但另一方面也帶來了 shell 腳本操作的復(fù)雜性,寫起來比較不容易, 需要考慮的細(xì)節(jié)、步驟也比較多。通過上面這幾個(gè)簡單案例的分析比較,可以看到集算器 SPL 在實(shí)現(xiàn)分組統(tǒng)計(jì)方面能簡化操作,降低難度,從而有效地幫助我們解決問題。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前名稱:MongoDB分組統(tǒng)計(jì)-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://newbst.com/article8/hhgip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司定制網(wǎng)站網(wǎng)站維護(hù)搜索引擎優(yōu)化網(wǎng)站制作網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司