摘要:開門見山,是我造的,哈哈,為的就是讓各位能夠對引起注意。執行一次,,果然就可以使用我們自定義的函數了。到這里,我們基本就可以實現一個自定義的的強大組合了上海小胖原創地址歡迎各位大神前來評論。每周五,敬請期待,上海小胖獨更。
開門見山,20%是我造的,哈哈,為的就是讓各位mongoer能夠對db.system.js collection 引起注意。
這個也是在我最近瀏覽InfoQ 的時候,看到一篇關于MongoDB 文章1的時候意識到的問題,隨后和開發們溝通了下,結果是對這個collection 不是很了解,遂生此文。
system.js先來看下官文給出的解釋:
.system.js
The.system.js collection holds special JavaScript code for use in server side JavaScript. See Store a JavaScript Function on the Server for more information.
解釋很簡單,馬上就進入實操環節
db.system.js.save( { _id: "echoFunction", value : function(x) { return x; } } )
但是并沒有任何效果,shell里表示,echoFunction undefined.
在查看 db.system.js 確實有一條記錄
> db.system.js.find({_id: "echoFunction"}).pretty() { "_id" : "echoFunction", "value" : { "code" : "function (x) { return x; }" } }
繼續查看doc,原來還需要通過 loadServerScripts 函數 load 進數據字典,這個操作就有點像我們在linux 環境中 source ~/.bash_profile 一樣了。
執行一次,db.loadServerScripts() , 果然就可以使用我們自定義的函數了。
那問題來了,如何提升我們的工作效率呢?
在MongoDB 中,雖然有 $sum, $avg 等一系列的pipeline,但是,對于DBA也好,Developer 也罷,許多的報表、統計aggregation 并不能完全代勞,mapReduce 就是為了這個時候而上的,那每次都要去寫一個function 去 sum,去 avg 總顯得在反復造輪子,因此我們完全可以在這種情況下,在 db.system.js 中加入我們常用的統計函數,比如 sum, avg, max, min 等等。
這里我就給出自己常用的函數供大家參考:
SUM
db.system.js.save( { _id : "Sum" , value : function(key,values) { var total = 0; for(var i = 0; i < values.length; i++) total += values[i]; return total; }});
AVERAGE
db.system.js.save( { _id : "Avg" , value : function(key,values) { var total = Sum(key,values); var mean = total/values.length; return mean; }});
MAX
db.system.js.save( { _id : "Max" , value : function(key,values) { var maxValue=values[0]; for(var i=1;imaxValue) { maxValue=values[i]; } } returnmaxValue; }});
MIN
db.system.js.save( { _id : "Min" , value : function(key,values) { var minValue=values[0]; for(var i=1;iVARIANCE
db.system.js.save( { _id : "Variance" , value : function(key,values) { var squared_Diff = 0; var mean = Avg(key,values); for(var i = 0; i < values.length; i++) { var deviation = values[i] - mean; squared_Diff += deviation * deviation; } var variance = squared_Diff/(values.length); return variance; }});STD DEVIATION
db.system.js.save( { _id : "Standard_Deviation" , value : function(key,values) { var variance = Variance(key,values); return Math.sqrt(variance); }});MapReduce那么接下來我們就用Map-Reduce來結合之前的自定義聚合函數來做詳解。(這里權當各位大佬熟悉Map-Reduce了)
引入demo data
{ "_id" : ObjectId("4f7be0d3e37b457077c4b13e"), "_class" : "com.infosys.mongo.Sales", "orderId" : 1, "orderDate" : "26/03/2011", "quantity" : 20, "salesAmt" : 200, "profit" : 150, "customerName" : "CUST1", "productCategory" : "IT", "productSubCategory" : "software", "productName" : "Grad", "productId" : 1 } { "_id" : ObjectId("4f7be0d3e37b457077c4b13f"), "_class" : "com.infosys.mongo.Sales", "orderId" : 2, "orderDate" : "23/05/2011", "quantity" : 30, "salesAmt" : 200, "profit" : 40, "customerName" : "CUST2", "productCategory" : "IT", "productSubCategory" : "hardware", "productName" : "HIM", "productId" : 1 } { "_id" : ObjectId("4f7be0d3e37b457077c4b140"), "_class" : "com.infosys.mongo.Sales", "orderId" : 3, "orderDate" : "22/09/2011", "quantity" : 40, "salesAmt" : 200, "profit" : 80, "customerName" : "CUST1", "productCategory" : "BT", "productSubCategory" : "services", "productName" : "VOCI", "productId" : 2 } { "_id" : ObjectId("4f7be0d3e37b457077c4b141"), "_class" : "com.infosys.mongo.Sales", "orderId" : 4, "orderDate" : "21/10/2011", "quantity" : 30, "salesAmt" : 200, "profit" : 20, "customerName" : "CUST3", "productCategory" : "BT", "productSubCategory" : "hardware", "productName" : "CRUD", "productId" : 2 } { "_id" : ObjectId("4f7be0d3e37b457077c4b142"), "_class" : "com.infosys.mongo.Sales", "orderId" : 5, "orderDate" : "21/06/2011", "quantity" : 50, "salesAmt" : 200, "profit" : 20, "customerName" : "CUST3", "productCategory" : "BT", "productSubCategory" : "hardware", "productName" : "CRUD", "productId" : 1 }創建聚合函數Sum
db.system.js.save({ _id : "Sum" , value: function(key,values) { var total = 0; for(var i = 0; i < values.length; i++) total += values[i]; return total; } });結合Sum 聚合函數執行Map-Reduce
db.runCommand( { mapreduce: "sales" , map: function() { emit({ key0:this.productCategory, key1:this.productSubCategory, key2:this.productName }, this.salesAmt ); }, reduce: function(key, values) { var result = Sum(key, values); return result; }, out: {inline: 1} } )這里,就直接把結果輸出的stdout 了,如果需要可以指定collection,將我們的Map-Reduce結果存儲下來。
來看一下結果
{ "results" : [ { "_id" : { "key0" : "BT", "key1" : "hardware", "key2" : "CRUD" }, "value" : 400 }, { "_id" : { "key0" : "BT", "key1" : "services", "key2" : "VOCI" }, "value" : 200 }, { "_id" : { "key0" : "IT", "key1" : "hardware", "key2" : "HIM" }, "value" : 200 }, { "_id" : { "key0" : "IT", "key1" : "software", "key2" : "Grad" }, "value" : 200 } ], "timeMillis" : 14, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 4 }, "ok" : 1 }這里可以看到,我們的Sum 函數已經將emit 過后的 "productCategory" : "BT", "productSubCategory" : "hardware", "productName" : "CRUD" 這組數據的 salesAmt 累加了。
到這里,我們基本就可以實現一個自定義的Function + Map-Reduce 的強大組合了!
上海小胖[MiracleYoung] 原創地址: https://segmentfault.com/u/shanghaixiaopang/articles
歡迎各位大神前來評論。
每周五,敬請期待,上海小胖[MiracleYoung] 獨更。
如果夏雨荷還在大明湖畔等著我的話,我就不更了。
Implementing Aggregation Functions in MongoDB ?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19074.html
摘要:日志服務提供就是為解決以上輕量級埋點采集場景而生,我們可以在分鐘時間內完成埋點和數據上報工作。服務功能包括實時采集與消費。 摘要: 當我們有一個新內容時(例如新功能、新活動、新游戲、新文章),作為運營人員總是迫不及待地希望能盡快傳達到用戶,因為這是獲取用戶的第一步、也是最重要的一步。 點此查看原文:http://click.aliyun.com/m/40929/ 我們發送重要郵件時為...
摘要:日志服務提供就是為解決以上輕量級埋點采集場景而生,我們可以在分鐘時間內完成埋點和數據上報工作。服務功能包括實時采集與消費。 摘要: 當我們有一個新內容時(例如新功能、新活動、新游戲、新文章),作為運營人員總是迫不及待地希望能盡快傳達到用戶,因為這是獲取用戶的第一步、也是最重要的一步。 點此查看原文:http://click.aliyun.com/m/40929/ 我們發送重要郵件時為...
摘要:從管事到管人的根本轉變其實,除了上述領域,開源軟件在企業管理中已成為不可或缺的工具,在人,財,物等資源的管理上發揮著越來越重要的作用。也正因此,開源軟件受到了很多企業的歡迎。 開源軟件的應用領域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯網而無需其他額外費用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...
摘要:從管事到管人的根本轉變其實,除了上述領域,開源軟件在企業管理中已成為不可或缺的工具,在人,財,物等資源的管理上發揮著越來越重要的作用。也正因此,開源軟件受到了很多企業的歡迎。 開源軟件的應用領域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯網而無需其他額外費用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...
摘要:從管事到管人的根本轉變其實,除了上述領域,開源軟件在企業管理中已成為不可或缺的工具,在人,財,物等資源的管理上發揮著越來越重要的作用。也正因此,開源軟件受到了很多企業的歡迎。 開源軟件的應用領域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯網而無需其他額外費用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...
閱讀 653·2021-11-23 09:51
閱讀 3600·2021-11-15 11:38
閱讀 927·2021-10-14 09:42
閱讀 3166·2021-09-29 09:35
閱讀 2104·2021-09-03 10:33
閱讀 769·2021-07-30 16:33
閱讀 1558·2019-08-30 15:55
閱讀 1841·2019-08-30 14:04