在mongodb集合中,我们需要进行数据的迁移处理时,将源集合中的数据按照近一年数据批量迁移到目标目标集合中我们可采用shell 脚本进行处理。
1.创建shell脚本命令
touch move_data.sh
2.给脚本赋予权限
chmod +x move_data.sh
3.编写mongodb批量处理脚本
#!/bin/bash
# 设置数据库连接参数
MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_DB="your_db_name"
MONGO_USER="your_db_user"
MONGO_PASSWORD="your_db_password"
# 源集合和目标集合名称
rsp_info="rsp_info"
rsp_info_old="rsp_info_old"
current_date=$(date +"%Y-%m-%d")
# 循环输出一年内的日期e
for i in {1..366}
do
echo $current_date
current_date=$(date -d "$current_date - 1 day" +"%Y-%m-%d")
current_date_end=$current_date"T24:00:00"
# 查询数据的MongoDB命令
QUERY_COMMAND="{
\"RecvTime\": {
\"\$gte\": \"$current_date\",
\"\$lte\":\"$current_date_end\"
}
}"
# 查询数据的MongoDB命令
echo $QUERY_COMMAND
# 使用MongoDB命令行客户端执行查询操作
query_result=$(mongo --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASSWORD $MONGO_DB --quiet --eval "JSON.stringify(db.$rsp_info.find($QUERY_COMMAND).toArray())")
# 检查查询是否成功
if [ $? -eq 0 ]; then
# 执行批量插入操作
insert_command="var dataToInsert = $query_result;
var bulk = db.$rsp_info_old.initializeUnorderedBulkOp();
dataToInsert.forEach(function(doc) {
var modifiedDoc = {};
for (var key in doc) {
if (key !== '_id') {
modifiedDoc[key] = doc[key];
}
if(key =='SerialNo' || key=='IsStatus' || key =='ReadFlag'){
modifiedDoc[key] = NumberInt(doc[key]); // 指定整数类型
}
}
bulk.insert(modifiedDoc);
});
bulk.execute();"
# 写入插入命令到一个临时文件
echo "$insert_command" > insert.js
# echo $insert_command
mongo --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASSWORD $MONGO_DB insert.js
# 检查插入操作是否成功
if [ $? -eq 0 ]; then
echo "数据从 $rsp_info 批量插入到 $rsp_info_old 成功"
else
echo "数据批量插入操作失败"
fi
else
echo "数据查询操作失败"
fi
done
4. 添加定时任务
crontab -e
service crond restart 重启
总结: 当批量插入数据的时候需要注意数据类型