开门见山,20%是我造的,哈哈,为的就是让各位mongoer能够对db.system.js collection 引起注意。

这个也是在我最近浏览InfoQ 的时候,看到一篇关于MongoDB 文章

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

{

if(values[i]>maxValue)

{

maxValue=values[i];

}

}

returnmaxValue;

}});

MIN

db.system.js.save( { _id : "Min" ,

value : function(key,values)

{

var minValue=values[0];

for(var i=1;i

{

if(values[i]

{

minValue=values[i];

}

}

return minValue;

}});

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来结合之前的自定义聚合函数来做详解。(这里权当各位大佬熟悉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] 独更。

如果夏雨荷还在大明湖畔等着我的话,我就不更了。

python js 效率_巧用 db.system.js 提升20% 开发效率相关推荐

  1. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  2. linux物联网项目,6个开源项目提升物联网开发效率

    有数据显示,目前物联网端口数量预计在200亿个左右.到2035年,这个数字会扩大到1万亿,平均每个人会拥有超过100台端口设备,它们将涉及穿戴.家居.交通.教育.通信等人类生活的各个领域. 毫无疑问, ...

  3. 如何提升团队开发效率

    前言   无论是哪家企业无论哪个行业可能都避不开效率问题,可能这也是大部分管理.老板最为看重的地方.原因就不多说了,相信都明白,我在这里讨论的特指软件团队开发效率的问题.   有时候看到现在各种996 ...

  4. vue生成静态js文件_如何立即使用Vue.js生成静态网站

    vue生成静态js文件 by Ondřej Polesný 通过OndřejPolesný 如何立即使用Vue.js生成静态网站 (How to generate a static website w ...

  5. vue.js部署_如何将安全Vue.js应用程序部署到AWS

    vue.js部署 本文最初发布在Okta开发人员博客上 . 感谢您支持使SitePoint成为可能的合作伙伴. 编写Vue应用程序直观,直接,快捷. Vue具有较低的进入门槛,基于组件的方法以及诸如热 ...

  6. usb 系统消息_别让 USB 传输速度影响 Android 开发效率

    概览 迭代速度是构建高质量 Android 应用的关键要素.处理的速度越快,应用程序的体验就越顺畅.这篇文章将和大家聊聊如何优化部署时间. 部署 101 在 Android Studio 3.5 中, ...

  7. 加mp4文件后js失效_记录一波video.js的使用及问题

    最近的项目中需要播放视频,鉴于html5元素的一些坑及不想自己造轮子,于是就找到了web端播放视频使用量最多的插件video.js,video.js是国外开发者开发的,英语本身就不好的我看英文文档简直 ...

  8. 【效率专精系列】善用API统一描述语言提升RestAPI开发效率

    团队内部RestAPI开发采用设计驱动开发的模式,即使用API设计文档解耦前端和后端的开发过程,双方只在联调与测试时耦合.在实际开发和与前端合作的过程中,受限于众多因素的影响,开发效率还有进一步提高的 ...

  9. 17个提升iOS开发效率的神器

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...

最新文章

  1. 一个当了爹的程序员的自白
  2. Linux Kernel 5.10 aarch64体系对TTBR寄存器的设置
  3. JDK和cglib动态代理代码示例
  4. 中国工商银行基金定投
  5. HTML CSS里display:block的原理和用法
  6. mybatis 一对多_Mybatis 强大的结果集映射器resultMap
  7. 最全整理浏览器兼容性问题与解决方案(转)
  8. linux中项目部署和日志查看
  9. 虚拟主机安装mysql_如何虚拟主机安装mysql
  10. hadoop应用开发技术..._大数据技术与应用——万物皆可数据化
  11. GO_10:GO语言基础之error
  12. 基于C#的图书管理系统
  13. bio-linux软件包教程,biolinux包含软件
  14. 回溯法 子集和问题
  15. Android动态更改TextView的字体大小
  16. 我在智联招聘上的行为测试
  17. Maven是主要干嘛的呢
  18. [SSL: CERTIFICATE_VERIFY_FAILED]
  19. 因为铂金Birkin包 爱马仕把数字艺术家告了
  20. pg_regress 使用技巧

热门文章

  1. ios业务模块间互相跳转的解耦方案
  2. 【iOS】iOS 调试快速定位程序在哪崩溃
  3. CBitMap的用法 from http://www.cnblogs.com/toconnection/archive/2012/08/04/mfc.html
  4. NGINX 配置404错误页面转向
  5. vim 折叠的用法
  6. 计算机网络 实验 使用端口完成地址转换,Wireshark抓包工具计算机网络实验解析...
  7. java5年转c语言,时隔5年,C语言再次领先Java,荣登编程语言排行榜第一!
  8. java循环链表类_3、循环链表(java实现)
  9. mac photoshop install无法安装_MAC安装应用报错:无法打开或文件损坏的处理方法~...
  10. 如何使一台计算机可以在互联网上访问到