You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:03:36