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

mongoexport无法识别$or、$gt、ISODate()的问题求助

问题解决:mongoexport查询解析错误及日期查询匹配问题

错误根源

  1. mongoexport不支持Mongo Shell的ISODate()语法:mongoexport要求--query参数使用Mongo扩展JSON格式,而非Shell环境特有的ISODate()构造函数,直接写ISODate('xxx')会被当成无效JSON字符串解析,导致报错。
  2. 日期时区格式不匹配:原date命令输出的%z是+0800格式,而Mongo扩展JSON要求时区带冒号(如+08:00),否则会被视为无效日期。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:43