同MySQL数据库类似,MongoDB也可通过mongo客户端命令连接到mongo服务器来进行日常管理。这个命令行工具就是mongo,通过mongo命令可以连接在linux shell或者mongo shell下执行脚本,特别指出的是mongo通过JavaScript脚本的方式来处理数据及管理mongodb。本文就平常工作过程中会遇到需要导出一些mongo查询数据用作分析,通过shell脚本获取mongo命令输出并导出excel表格过程:写个js脚本,mongo执行,重定向输出到文件,再转成xls格式。使用的mongo版本3.6.10。
在shell脚本里面执行mysql命令相对比较简单,后续会再写关于mysql数据查询导出成excel表格,此处按下不表,且听下篇分解
,mongodb通过shell脚本获取输出,必须使用print()或printjson()语句,否则MongoDB将对脚本的任何输出保持静默。
在命令行交互模式中 mongo将所有的结果打印出来,在JavaScript脚本中使用print()或者printjson()方法来返回JSON格式。
查找官网下表将最常见的mongo shell帮助命令一一对应它的JavaScript脚本
以下介绍shell命令行方式运行mongo命令
1、通过--eval的方式传入JavaScript脚本:
命令增加--quiet 参数去掉一些无关的输出
[root@xxxx-test mongo]# mongo192.168.xx.xx:27017/db_name --username --password --quiet --eval"printjson(db.adminCommand('listDatabases'))"
2、通过mongodb交互式命令行运行该脚本。可以在函数中添加mongo命令以方便调用它们。像以下这样创建脚本:
[root@xxxx-test mongo]# cat example.js
var example = function(){
printjson(db.getUsers())
}
将上面的内容保存到名为example.js的文件中,然后从mongo shell输入:
> load('/root/oms/mongo/example.js')
> example() #输入example()来调用该功能
这样可以整合很多包含类似这样的mongo命令的数据处理脚本。
3、通过将命令放到javascript文件(.js结尾)并使用mongo命令来运行它:
[root@xxxx-test mongo]# cat example.js
var cmd = db.getUsers()
printjson(cmd)
[root@xxxx-test mongo]# mongo192.168.xx.xx:27017/db_name --username --password --quiet example.js
了解了以上在shell中执行mongo命令的方式,接下来在脚本中进行运用:
#!/bin/bash#mongo查询导出excelSTART_DATE=$1 #开始时间END_DATE=$2 #结束时间PAGE_PATH=$3 #页面参数#mongo存储时间是标准时间,与北京时间相差八小时#2020-03-13T08:55:00.000Z mongo存储时间格式#2020-03-13T09:05:00.000Z mongo存储时间格式#1238008166666606017if [ $# -ne 3 ];then echo -e "\033[31mthe number of parameters is not correct: sh $0 param1 param2 param3\033[0m" exit 1fi#该js脚本是查询指定时间范围内的数据cat > /root/oms/mongo/goods_data.js<#变量符号前加转义符"\"是为了防止写入js文件过程当中去寻找相应变量,即进行原样输入var cmd =db.getCollection('mongo_activity_event').aggregate([ { \$match: { event: 66666, //定义筛选规则 pageName: 'MongoJSDetail', //筛选指定的访问页面 pagePath: {\$regex:/${PAGE_PATH}/}, //指定页面参数 create_time:{"\$gte":ISODate('${START_DATE}'),\$lt:ISODate('${END_DATE}')} //指定时间范围 } }, { \$group: { _id: { 'login_name':'\$login_name', 'member_name':'\$member_name', 'merchant_name':'\$merchant_name' } } }, { \$project: { 'loginName':'\$_id.login_name', 'memberName':'\$_id.member_name', 'merchantName':'\$_id.merchant_name', _id: 0 } }])//js写的很丑陋,请轻喷,满足要求即可(难得前端大神有空指导一下)print('账户名称\t会员名称\t所属商家')while(cmd.hasNext()) { var row = cmd.next(); var temp = ''; if(row['loginName'] != null && row['loginName'] !=undefined && row['loginName'] != '' ){temp=temp +row['loginName']+ "\t"} else{temp+="N/A\t"} if(row['memberName'] != null && row['memberName'] !=undefined && row['memberName'] != '' ){temp=temp +row['memberName']+ "\t"} else{temp+="N/A\t"} if(row['merchantName'] != null && row['merchantName'] !=undefined && row['merchantName'] != '' ){temp=temp +row['merchantName']+ "\t"} else{temp+="N/A\t"} print(temp);}EOFMONGO_CONN="192.168.xx.xx:27017/db_name"source /etc/profilecd /root/oms/mongomongo ${MONGO_CONN} --username --password --quiet /root/oms/mongo/goods_data.js > goods_data.txt#txt2excel.py是txt转换excel的python脚本,资源很容易能找到,这里不再贴出来,生成good_data.xls文件python /root/oms/txt2excel.py /root/oms/mongo/goods_data.txt goods_data
goods_data.xls数据类似如下: