mongoexport无法识别$or、$gt、ISODate()的问题求助
问题解决:mongoexport查询解析错误及日期查询匹配问题
错误根源
- mongoexport不支持Mongo Shell的ISODate()语法:
mongoexport要求--query参数使用Mongo扩展JSON格式,而非Shell环境特有的ISODate()构造函数,直接写ISODate('xxx')会被当成无效JSON字符串解析,导致报错。 - 日期时区格式不匹配:原
date命令输出的%z是+0800格式,而Mongo扩展JSON要求时区带冒号(如+08:00),否则会被视为无效日期。 - Bash引号转义混乱:原脚本中大量不必要的转义导致JSON结构被破坏,解析出错。
修正步骤及完整脚本
1. 修正日期格式
使用%:z代替%z输出带冒号的时区,同时调整日期计算参数(部分date版本需要months复数形式):
DATE_NOW=$(date +%Y-%m-%dT%H:%M:%S%:z) DATE_EXPIRED=$(date +%Y-%m-%dT%H:%M:%S%:z -d "$DATE_NOW - 3 months")
2. 构造正确的扩展JSON查询
将ISODate('xxx')替换为Mongo扩展JSON的日期格式{"$date": "xxx"},用heredoc构造JSON避免转义混乱:
QUERY=$(cat <<EOF { "\$or": [ { "creationTime": { "\$gt": { "\$date": "$DATE_EXPIRED" } } }, { "requestTime": { "\$gt": { "\$date": "$DATE_EXPIRED" } } } ] } EOF )
3. 完整修正脚本
#!/bin/sh # 生成符合Mongo要求的日期格式(带冒号的时区) DATE_NOW=$(date +%Y-%m-%dT%H:%M:%S%:z) DATE_EXPIRED=$(date +%Y-%m-%dT%H:%M:%S%:z -d "$DATE_NOW - 3 months") echo "Expired date: $DATE_EXPIRED" # 用heredoc构造正确的扩展JSON查询 QUERY=$(cat <<EOF { "\$or": [ { "creationTime": { "\$gt": { "\$date": "$DATE_EXPIRED" } } }, { "requestTime": { "\$gt": { "\$date": "$DATE_EXPIRED" } } } ] } EOF ) echo "Query: $QUERY" DB=nexuspay # 获取集合列表,简化引号处理 DB_COLLECTIONS=$(mongosh "mongodb://localhost:27017/$DB?authSource=admin" --norc --quiet --eval "db.getCollectionNames().join(' ')") # 创建备份目录,避免导出失败 BACKUP_DIR="backup-$(date +%d%m%Y)" mkdir -p "$BACKUP_DIR" for collection in $DB_COLLECTIONS; do echo "Exporting $DB/$collection ..." mongoexport --db="$DB" --collection="$collection" --query="$QUERY" --out="$BACKUP_DIR/$collection.json" # echo "Deleting $DB/$collection ..." # mongosh "mongodb://localhost:27017/$DB?authSource=admin" --norc --quiet --eval "db.$collection.deleteMany($QUERY)" done echo "BACKUP AND CLEAN DATABASE COMPLETE"
关键说明
- 扩展JSON日期格式:Mongo工具(如
mongoexport)接受的日期格式为{"$date": "YYYY-MM-DDTHH:MM:SS±HH:MM"},这是标准ISO 8601格式,与Mongo Shell的ISODate()等价且符合JSON语法规范。 - Bash引号处理:
heredoc是构造复杂JSON最可靠的方式,可避免手动转义双引号和美元符号的繁琐操作。 - 备份目录保障:新增
mkdir -p "$BACKUP_DIR"确保备份目录存在,防止因目录缺失导致导出失败。
内容的提问来源于stack exchange,提问作者Alfianto Christopher
相关产品推荐
相关产品推荐

