成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

巧用 db.system.js 提升20% 開發(fā)效率

flybywind / 1173人閱讀

摘要:開門見山,是我造的,哈哈,為的就是讓各位能夠?qū)σ鹱⒁?。?zhí)行一次,,果然就可以使用我們自定義的函數(shù)了。到這里,我們基本就可以實(shí)現(xiàn)一個自定義的的強(qiáng)大組合了上海小胖原創(chuàng)地址歡迎各位大神前來評論。每周五,敬請期待,上海小胖獨(dú)更。

開門見山,20%是我造的,哈哈,為的就是讓各位mongoer能夠?qū)b.system.js collection 引起注意。

這個也是在我最近瀏覽InfoQ 的時(shí)候,看到一篇關(guān)于MongoDB 文章1的時(shí)候意識到的問題,隨后和開發(fā)們溝通了下,結(jié)果是對這個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.

解釋很簡單,馬上就進(jìn)入實(shí)操環(huán)節(jié)

db.system.js.save(
   {
     _id: "echoFunction",
     value : function(x) { return x; }
   }
)

但是并沒有任何效果,shell里表示,echoFunction undefined.

在查看 db.system.js 確實(shí)有一條記錄

> db.system.js.find({_id: "echoFunction"}).pretty()
{
        "_id" : "echoFunction",
        "value" : {
                "code" : "function (x) { return x; }"
        }
}

繼續(xù)查看doc,原來還需要通過 loadServerScripts 函數(shù) load 進(jìn)數(shù)據(jù)字典,這個操作就有點(diǎn)像我們在linux 環(huán)境中 source ~/.bash_profile 一樣了。

執(zhí)行一次,db.loadServerScripts() , 果然就可以使用我們自定義的函數(shù)了。

那問題來了,如何提升我們的工作效率呢?

在MongoDB 中,雖然有 $sum, $avg 等一系列的pipeline,但是,對于DBA也好,Developer 也罷,許多的報(bào)表、統(tǒng)計(jì)aggregation 并不能完全代勞,mapReduce 就是為了這個時(shí)候而上的,那每次都要去寫一個function 去 sum,去 avg 總顯得在反復(fù)造輪子,因此我們完全可以在這種情況下,在 db.system.js 中加入我們常用的統(tǒng)計(jì)函數(shù),比如 sum, avg, max, min 等等。

這里我就給出自己常用的函數(shù)供大家參考:

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;i

VARIANCE

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來結(jié)合之前的自定義聚合函數(shù)來做詳解。(這里權(quán)當(dāng)各位大佬熟悉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 }

創(chuàng)建聚合函數(shù)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;
            }
    });

結(jié)合Sum 聚合函數(shù)執(zhí)行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}
    }
)

這里,就直接把結(jié)果輸出的stdout 了,如果需要可以指定collection,將我們的Map-Reduce結(jié)果存儲下來。

來看一下結(jié)果

{
        "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 函數(shù)已經(jīng)將emit 過后的 "productCategory" : "BT", "productSubCategory" : "hardware", "productName" : "CRUD" 這組數(shù)據(jù)的 salesAmt 累加了。

到這里,我們基本就可以實(shí)現(xiàn)一個自定義的Function + Map-Reduce 的強(qiáng)大組合了!

上海小胖[MiracleYoung] 原創(chuàng)地址: https://segmentfault.com/u/shanghaixiaopang/articles

歡迎各位大神前來評論。

每周五,敬請期待,上海小胖[MiracleYoung] 獨(dú)更。

如果夏雨荷還在大明湖畔等著我的話,我就不更了。


Implementing Aggregation Functions in MongoDB ?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19074.html

相關(guān)文章

  • 巧用 Img / JavaScript 采集頁面數(shù)據(jù)

    摘要:日志服務(wù)提供就是為解決以上輕量級埋點(diǎn)采集場景而生,我們可以在分鐘時(shí)間內(nèi)完成埋點(diǎn)和數(shù)據(jù)上報(bào)工作。服務(wù)功能包括實(shí)時(shí)采集與消費(fèi)。 摘要: 當(dāng)我們有一個新內(nèi)容時(shí)(例如新功能、新活動、新游戲、新文章),作為運(yùn)營人員總是迫不及待地希望能盡快傳達(dá)到用戶,因?yàn)檫@是獲取用戶的第一步、也是最重要的一步。 點(diǎn)此查看原文:http://click.aliyun.com/m/40929/ 我們發(fā)送重要郵件時(shí)為...

    sunny5541 評論0 收藏0
  • 巧用 Img / JavaScript 采集頁面數(shù)據(jù)

    摘要:日志服務(wù)提供就是為解決以上輕量級埋點(diǎn)采集場景而生,我們可以在分鐘時(shí)間內(nèi)完成埋點(diǎn)和數(shù)據(jù)上報(bào)工作。服務(wù)功能包括實(shí)時(shí)采集與消費(fèi)。 摘要: 當(dāng)我們有一個新內(nèi)容時(shí)(例如新功能、新活動、新游戲、新文章),作為運(yùn)營人員總是迫不及待地希望能盡快傳達(dá)到用戶,因?yàn)檫@是獲取用戶的第一步、也是最重要的一步。 點(diǎn)此查看原文:http://click.aliyun.com/m/40929/ 我們發(fā)送重要郵件時(shí)為...

    WrBug 評論0 收藏0
  • 巧用開源軟件做好企業(yè)管理

    摘要:從管事到管人的根本轉(zhuǎn)變其實(shí),除了上述領(lǐng)域,開源軟件在企業(yè)管理中已成為不可或缺的工具,在人,財(cái),物等資源的管理上發(fā)揮著越來越重要的作用。也正因此,開源軟件受到了很多企業(yè)的歡迎。 開源軟件的應(yīng)用領(lǐng)域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯(lián)網(wǎng)而無需其他額外費(fèi)用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...

    novo 評論0 收藏0
  • 巧用開源軟件做好企業(yè)管理

    摘要:從管事到管人的根本轉(zhuǎn)變其實(shí),除了上述領(lǐng)域,開源軟件在企業(yè)管理中已成為不可或缺的工具,在人,財(cái),物等資源的管理上發(fā)揮著越來越重要的作用。也正因此,開源軟件受到了很多企業(yè)的歡迎。 開源軟件的應(yīng)用領(lǐng)域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯(lián)網(wǎng)而無需其他額外費(fèi)用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...

    余學(xué)文 評論0 收藏0
  • 巧用開源軟件做好企業(yè)管理

    摘要:從管事到管人的根本轉(zhuǎn)變其實(shí),除了上述領(lǐng)域,開源軟件在企業(yè)管理中已成為不可或缺的工具,在人,財(cái),物等資源的管理上發(fā)揮著越來越重要的作用。也正因此,開源軟件受到了很多企業(yè)的歡迎。 開源軟件的應(yīng)用領(lǐng)域廣泛 我們通常所說的開源軟件,是指所有公開源代碼的軟件。也就是說公眾可以通過極低的成本(如僅僅訪問互聯(lián)網(wǎng)而無需其他額外費(fèi)用)獲得該軟件的源代碼,并可自行修改源代碼以滿足自己的特殊需求。 開源軟件...

    huhud 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<