mongodb學習之:彙總

來源:互聯網
上載者:User

標籤:log   結果   文檔   數組   ++   javascrip   ndt   完成   例子   

@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋體"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5pt; }p.p { margin: 5pt 0pt; text-align: left; font-family: "Times New Roman"; font-size: 12pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

Mongodb除了基本的查詢功能,還提供了強大的彙總工具。這一章來看下如何使用彙總進行查詢

count:

count是最基本的彙總工具,返回集合中的文檔數量:

> db.student_infor.count()

10

還可以設定條件進行查詢

> db.student_infor.count({"age":{$gt:19}})

6

 

distinct:

distinct用來找出制定鍵的所有不同的值,在使用的時候必須指定集合和鍵

distinct對應的就是集合名字,key對應的是鍵。輸出結果是student_infor中的age所有的值

> db.runCommand({"distinct":"student_infor","key":"age"})

{ "values" : [ 21, 19, 20, 22, 18 ], "ok" : 1 }

 

group:

Group大約需要一下幾個參數。


 1.key:用來分組文檔的欄位。和keyf兩者必須有一個
 2.keyf:可以接受一個javascript函數。用來動態確定分組文檔的欄位。和key兩者必須有一個
 3.initial:reduce中使用變數的初始化
 4.reduce:執行的reduce函數。函數需要傳回值。
 5.cond:執行過濾的條件。
 6.finallize:在reduce執行完成,結果集返回之前對結果集最終執行的函數。可選的。

來看一個具體的例子:

>db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++}})

key:age代表用age來做分組。指定為true那麼相同的age將會被分成一組。

initial是指定了一個初始的值,將會在reduce中使用

reduce:每個文檔都對應一次這個調用,系統傳遞兩個參數:當前文檔和累加器文檔。doc代表當前正在迭代的文檔,prev就是累加器文檔,用來進行各種統計的累加。prev中用到的num就是在intial中初始的值

上面的執行結果如下:統計出了每個年齡的學生個數

[

{

"age" : 21,

"num" : 2

},

{

"age" : 19,

"num" : 1

},

{

"age" : 20,

"num" : 2

},

{

"age" : 22,

"num" : 2

},

{

"age" : 18,

"num" : 3

}

]

對於查詢我們還可以使用條件判斷進行篩選,方法則是採用condtion

> db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++},condition:{"age":{$gt:20}}})

得到age大於20的分組查詢情況。

[ { "age" : 21, "num" : 2 }, { "age" : 22, "num" : 2 } ]

 

還有另外一種寫法:

> db.runCommand({group:{ns:"student_infor",key:{age:true},initial:{num:0},$reduce:function(doc,prev){prev.num++}}})

這裡添加了一個ns參數,後面跟的是集合的名字。

 

aggregate:

MongoDB中彙總(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。有點類似sql語句中的 count(*)。

下表展示了一些彙總的運算式:

運算式

描述

執行個體

$sum

計算總和。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])

$avg

計算平均值

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])

$min

擷取集合中所有文檔對應值得最小值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

$max

擷取集合中所有文檔對應值得最大值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])

$push

在結果文檔中插入值到一個數組中。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

$addToSet

在結果文檔中插入值到一個數組中,但不棄置站台。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

$first

根據資來源文件的排序擷取第一個文檔資料。

db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last

根據資來源文件的排序擷取最後一個文檔資料

db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

來看一個具體的例子:group代表分組,id代表分組的依據,average是新一個新產生的欄位。$avg是平均的功能,”$age”代表是對age進行平均

>db.student_infor.aggregate({$group:{_id:"student_id",average:{$avg:"$age"}}})

{ "_id" : "student_id", "average" : 19.9 }

找到age最大的

>db.student_infor.aggregate({$group:{_id:"age",average:{$max:"$age"}}})

{ "_id" : "age", "average" : 22 }

找到age最小的

> db.student_infor.aggregate({$group:{_id:"age",average:{$min:"$age"}}})

{ "_id" : "age", "average" : 18 }

將age欄位插入到數組中

> db.student_infor.aggregate({$group:{_id:"age",average:{$push:"$age"}}})

{ "_id" : "age", "average" : [ 21, 19, 20, 22, 18, 18, 22, 21, 20, 18 ] }

對age進行求和

> db.student_infor.aggregate({$group:{_id:"age",average:{$sum:"$age"}}})

{ "_id" : "age", "average" : 199 }

mongodb學習之:彙總

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.