標籤: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學習之:彙總