编写Unix Shell脚本批量根据PID删除MongoDB集合文档
没问题,我来帮你搞定这个批量删除MongoDB文档的Shell脚本!核心思路是利用MongoDB的$in操作符来匹配批量PID,正好适配你需要的批量删除场景。下面我给你两种常用场景的实现方案,你可以根据自己的需求选择:
方案一:命令行直接传入批量PID
这个脚本适合你在执行时直接把要删除的PID作为参数传入的场景:
#!/bin/bash # 检查是否传入了PID参数 if [ $# -eq 0 ]; then echo "用法: $0 <PID1> <PID2> ... <PIDN>" exit 1 fi # -------------------------- 请修改以下配置 -------------------------- MONGO_DB="你的数据库名" MONGO_COLLECTION="你的集合名" # 如果MongoDB需要认证/指定主机端口,取消下面的注释并修改 # MONGO_ARGS="--host localhost --port 27017 --username 用户名 --password 密码 --authenticationDatabase admin" # ------------------------------------------------------------------- # 将命令行参数转换成MongoDB能识别的$in数组格式 PID_ARRAY=$(printf '"%s",' "$@" | sed 's/,$//') # 自动去掉最后一个多余的逗号 # 构建删除命令(推荐用deleteMany,比旧的remove语法更清晰规范) MONGO_COMMAND="db.${MONGO_COLLECTION}.deleteMany({PID: {\$in: [${PID_ARRAY}]}})" echo "正在删除PID列表: $* 对应的文档..." # MongoDB 4.2+ 推荐用mongosh,旧版本替换成mongo即可 mongosh ${MONGO_DB} ${MONGO_ARGS} --eval "${MONGO_COMMAND}" # 检查操作结果 if [ $? -eq 0 ]; then echo "删除操作完成!" else echo "删除失败,请检查MongoDB连接或参数是否正确。" exit 1 fi
使用示例:
# 给脚本加执行权限 chmod +x delete_by_pid.sh # 执行删除 ./delete_by_pid.sh 1234 5678 9012
方案二:从文件读取PID列表
如果你的PID数量很多,或者需要重复使用同一批PID,可以把PID写入文件(每行一个),用这个脚本读取并删除:
#!/bin/bash # 检查是否传入了文件路径参数 if [ $# -ne 1 ]; then echo "用法: $0 <PID文件路径>" exit 1 fi PID_FILE="$1" # 检查文件是否存在 if [ ! -f "${PID_FILE}" ]; then echo "错误:文件 ${PID_FILE} 不存在!" exit 1 fi # -------------------------- 请修改以下配置 -------------------------- MONGO_DB="你的数据库名" MONGO_COLLECTION="你的集合名" # MONGO_ARGS="--host localhost --port 27017 --username 用户名 --password 密码 --authenticationDatabase admin" # ------------------------------------------------------------------- # 读取文件中的PID,过滤空行后转换成MongoDB数组格式 PID_ARRAY=$(grep -v "^$" "${PID_FILE}" | printf '"%s",' | sed 's/,$//') if [ -z "${PID_ARRAY}" ]; then echo "文件中没有有效的PID!" exit 1 fi MONGO_COMMAND="db.${MONGO_COLLECTION}.deleteMany({PID: {\$in: [${PID_ARRAY}]}})" echo "正在删除文件 ${PID_FILE} 中列出的PID对应的文档..." mongosh ${MONGO_DB} ${MONGO_ARGS} --eval "${MONGO_COMMAND}" if [ $? -eq 0 ]; then echo "删除操作完成!" else echo "删除失败,请检查MongoDB连接或文件内容是否正确。" exit 1 fi
使用示例:
# 先创建PID文件,每行一个PID echo -e "1234\n5678\n9012" > pids.txt # 给脚本加执行权限 chmod +x delete_by_pid_file.sh # 执行删除 ./delete_by_pid_file.sh pids.txt
关键注意事项
- 验证删除范围:如果你不确定条件是否正确,可以先把
deleteMany改成find,运行脚本查看匹配的文档,确认无误后再改回deleteMany,避免误删。 - PID类型适配:如果你的
PID字段是数字类型而非字符串,可以把脚本中的printf '"%s",'改成printf '%s,',去掉引号避免类型不匹配。 - MongoDB版本:脚本中用了
mongosh,这是MongoDB 4.2及以上版本推荐的新Shell;如果是旧版本,替换成mongo命令即可。 - 权限检查:确保运行脚本的用户拥有目标MongoDB集合的删除权限,否则会返回权限错误。
内容的提问来源于stack exchange,提问作者SenthilMadhanT
相关产品推荐
相关产品推荐

