前文介绍过 pdepend 生成的两个 svg 文件,本文主要介绍我的 mongo shell 脚本,以解析 xml 格式的 summary report。解析之后生成的 csv 文件如下图,第一列是 class name,第二列是 method name,之后是 ccn,ccn2 的值。此图罗列了 pdepend 发现的复杂度最高的10个类/方法。
PS. 解析 xml 的方式很多,之所以用 mongo shell,只因为最近在玩 mongo罢了。
思路如下:
下述 Python 脚本把 pdepend 生成的 xml 文件转换成 json
import xmltodict
import json
config_content = open('summary_result.xml')
config_dict = xmltodict.parse(config_content)
config_json = json.dumps(config_dict)
print config_json
将 json 文件导入 mongo db
mongoimport --file summary_result.json
编写 mongo shell
完整的源码见:https://github.com/applewu/mongo_lab/blob/master/pdepend_analyser/analyse_pdepend_summary_result.js
执行 mongo shell,生成 csv 文件
mongo analyse_pdepend_summary_result.js > 0325.csv
好了,貌似到这里才扯到重点—— mongo shell;啃官方文档自然是王道:https://docs.mongodb.org/manual/reference/method/ 然而写个解析 json 的脚本,了解以下 mongo 语法就够了:
通过字段值,查询内嵌文档( json对象 ): 如metrics.@ccn 值为 9439
db.summary_result.find({"metrics.@ccn":"9439"})
不显示metrics字段:find第二个参数是可选的,指定返回哪些键
db.summary_result.find({},{"metrics":0})
解析package数组中的文档元素
var doc =db.summary_result.findOne();
doc.metrics.package.forEach(function(my_package){print(my_package['@name'])})
可能因为 Mongo shell methods 用的是 javascript 语法,所以有人说 Mongo db 中的存储过程是用 javascript 实现的,我觉得这种说法不太准确,人家毕竟不是关系型数据库,根本没有 store procedure 这种叫法。当然,存储过程中的游标,逻辑判断啥的,在 mongo shell 中都可以通过 js 实现。