需求:每天凌晨自动执行脚本,提取mongodb中前一天的数据,导出为json格式,然后把json文件上传到指定ftp上面。

计划:写shell脚本,写日期变量取凌晨执行时间的前一天,用mongoexport导出,加-p参数按日期筛选,最后在shell里登录到ftp上,上传文件,结束

 

开始!

-- mongodb 查询:

查询collection名为:authlog202008 的所有数据
db.authlog202008.find()

一个时间范围查询
db.authlog202008.find({ 
"authTime" : { $gte : new Date("2021-08-05T00:00:00Z") }
})

加了and条件的时间范围查询
db.authlog202008.find({
$and : [{"authTime" : { $lte : ISODate("2020-08-05 23:59:59.999") }}, {"authTime" : { $gt : ISODate("2020-08-05 00:00:00.000") }}]
})


-- mongoexport语句编写:
试写第一条语句
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : ISODate("2020-08-05 23:59:59.999") }}, {"authTime" : { $gt : ISODate("2020-08-05 00:00:00.000") }}] }).sort({authTime: 1}) -o /home/lzttest/authlog202008_0805.json

试着执行发现报错:
error validating settings: query 'xx xx xx ... xx' is not valid JSON: unexpected ISODate format

mongoexport貌似不支持ISODate,所以转换成new Date的时间格式

最后语句定型:
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/lzttest/authlog_"$Date".json


-- shell里日期变量:

shell 日期加减运算,比如今日是2012-04-22
$ date -d "+1 day" +%Y-%m-%d
2012-04-23

$ date -d "-1 day" +%Y-%m-%d
2012-04-21

需要用前一天的,so:
Date=`date -d "-1 day" +%Y-%m-%d`

变量的引用
直接引用到mongoexport语句中,$Date会出现问题,每个变量需要用单引号引起来,这样:
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/lzttest/authlog_"$Date".json

-- 测试ftp脚本
ftp -v -n 192.168.xx.xx <<EOF
user ftpuser ftppasswd
binary
cd upload
lcd /home/lzttest/
prompt
put authlog_"$Date".json
bye
EOF

注意我踩过的坑:
1、报这个错误:
warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
因为第一个EOF前后都不能有空格,<<和EOF要紧挨着。

2、这里引用变量$Date的方式

 

-- 2020.8.10 修改优化过的脚本

#!/bin/bash

#Declare
Date=`date -d "-1 day" +%Y-%m-%d`

#The time when we start mongoexport
Start=`date +"%Y-%m-%d %H:%M:%S"`

#Start mongoexport
/usr/local/mongodb/bin/mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/liangzt/authlog_"$Date".json

#The time when we finish mongoexport
End=`date +"%Y-%m-%d %H:%M:%S"`

#Output time record
echo "----------Begin:$Start---End:$End-----------Export complete!----------" >> /home/liangzt/backup_record.txt

#Put file to the ftp
ftp -v -n 192.168.40.239 <<EOF
user LT stbbcmmx
binary
cd upload60
lcd /home/liangzt/
prompt
put authlog_"$Date".json
bye
EOF

#The time when we finish ftp
End_ftp=`date +"%Y-%m-%d %H:%M:%S"`

echo -e "----------Time:$End_ftp---Commit to ftp successfully!----------\n" >> /home/liangzt/backup_record.txt

#Delete .json 5 days ago
#Declare
Date5=`date -d "-5 day" +%Y-%m-%d`

#Delete .json if exist
if [ -e /home/liangzt/authlog_"$Date5".json ];
then
rm -f /home/liangzt/authlog_"$Date5".json
fi;


-- 最后加入crontab,晚上凌晨2点执行,明早起来看下效果。

crontab -e

0 2 * * * /home/lzttest/export_by_day.sh