mongodb执行js脚本---shell执行

一、需求

       运营人员需要通过数据来分析活动效果,要求数据能从数据库提取到Excel表格并且能够做到周期性刷新,所以我们需要从数据库里面查询出数据并转换成csv格式,然后提供一个定时刷新的数据链接。

二、方案

2.1 编写脚本

2.1.1 编写统计shell脚本

  • 定义小时,今天,昨天这些时间变量,供后续js脚本中使用
  • 通过mongo --eval的方式传入参数,加载写好的zxjt-tyj.js脚本,--quiet表示不把数据库连接关闭的信息写进oplog
  • 将生成的txt文件的utf8编码转换为gb18030编码,然后另存为csv文件
  • 把csv中的“\t”替换成“,”,因为excel表格中是以,为分割标识的
  • 拷贝生成好的csv文件拷贝到web服务器目录

 ] # vim stat.sh

cd /jobs/zxjtlcj5
hour=`date "+%Y%m%d%H%M"`
today=`date "+%Y%m%d"`
todayFormat=`date "+%Y-%m-%d"`
yesterday=`date -d "1 day ago" "+%Y%m%d"`
yesterdayFormat=`date -d "1 day ago" "+%Y-%m-%d"`
beforeyesterday=`date -d "2 day ago" "+%Y%m%d"`
beforeyesterdayFormat=`date -d "2 day ago" "+%Y-%m-%d"`


mongo  --eval 'var orgId=9317; var todayInt='${today}'; var yesterdayInt='${yesterday}'; 
var todayStr="'${todayFormat}'";var yesterdayStr="'${yesterdayFormat}'";'  zxjt-tyj.js --quiet > file/zxjttyjstat-$hour.txt

mongo --authenticationDatabase=admin -uroot -pMogu07550831** statistics_b --host 127.0.0.1 --port 27017 --eval 'var orgId=9317;var yesterdayInt='${yesterday}'; 
var beforeyesterdayInt='${beforeyesterday}';var yesterdayStr="'${yesterdayFormat}'"; var beforeyesterdayStr="'${beforeyesterdayFormat}'";' --quiet awardRank.js > file/zxjtawardRank-$hour.txt

iconv -f utf8 -t gb18030 file/zxjttyjstat-$hour.txt -o file/zxjttyjstat-$hour.csv
iconv -f utf8 -t gb18030 file/zxjtawardRank-$hour.txt -o file/zxjtawardRank-$hour.csv

sed -i 's|\t|,|g' file/*-$hour.csv

cp -f file/*-$hour.csv /plk/stat_public/zxjtlcj5

2.1.2 编写统计js脚本

  • 在js脚本中建立数据库连接,js文件中的数据库连接相当于 mongo shell中直接连了 ***rds.aliyun.com:3717/admin数据库
  • 切换到everydaykline_b库中查询数据
  • 切换到statistics_b库中查询数据
  • 输出统计结果str

 ] # vim awardRank

function switchConn(db) {
    db = conn.getDB(db);
    return db;
}

conn = new Mongo("dds-****.mongodb.rds.aliyuncs.com:3717");
db=conn.getDB("admin");
db.auth("***", "*****");


db = switchConn('statistics_b');
var str='用户id\t领取时间\t手机号\t金额\t金额说明\t抽奖记录编号';
db.asset_allocation_consult_voucher_log.find({orgId:9317,"date": { $gte: ISODate(beforeyesterdayStr +"T23:00:00.000+0000"), 
$lt: ISODate(yesterdayStr +"T23:00:00.000+0000")}}).forEach(function(t){
...

db=switchConn('everydaykline_b');
...

print(str);

2.1.3 编写定时任务

  • 每30分钟执行一次统计脚本stat.sh,stat.sh加载js,从数据库查出数据形成csv供用户查询

]# vim /etc/cron.d/job.cron

0,30 0-23 * * * root sh /jobs/zxjtlcj5/stat.sh

2.2 配置Nginx

要让生成好的文件被运营访问到,需要配置nginx路径指向生成好的文件路径

  • 只要是m.moguyun.com域名下的访问/nginx-check就转发到/plk/stat_public目录

 ] # vim m.moguyun.com.conf

location /nginx-check {
       alias      /plk/stat_public;
       index      index.html;
}

当访问https://m.moguyun.com/nginx-check/stat/zxjtlcj5/***-201912280100.csv即可下载从Mongo数据库查询到的数据。

查询出来的数据效果图如下:

mongodb执行js脚本---shell执行_第1张图片

你可能感兴趣的:(#,MongoDB)