如何在mongoexport命令中使用当前日期构造查询条件
问题根因
你遇到的报错来自两个错误用法:
- 用单引号包裹
--query参数内容时,Shell不会解析单引号内部的$变量,你的$currentDate没有被替换为实际的日期值 - 直接对日期字符串做
-1运算不符合ISODate要求的YYYY-MM-DDTHH:mm:ssZ标准格式,需要提前生成符合格式的日期变量
正确实现方案
你需要先通过Shell的date命令生成符合ISODate格式的前后日期变量,再传入mongoexport命令,不同操作系统的date命令参数存在差异:
1. Linux 环境
# 生成UTC时区当天0点的标准ISODate格式字符串 currentDate=$(date -u +"%Y-%m-%dT00:00:00Z") # 生成UTC时区前一天0点的标准ISODate格式字符串 yesterdayDate=$(date -u -d "1 day ago" +"%Y-%m-%dT00:00:00Z") # 执行mongoexport,注意query用双引号包裹时内部的$需要转义,避免被Shell解析为变量 mongoexport --db=branchless_lampung --collection=logInfo \ --query "{date:{\$gte:ISODate(\"$yesterdayDate\"),\$lt:ISODate(\"$currentDate\")}}" \ --out=/bin/dump/log_info.json
你也可以用单引号拼接的写法,不需要转义$:
mongoexport --db=branchless_lampung --collection=logInfo \ --query '{date:{$gte:ISODate("'"$yesterdayDate"'"),$lt:ISODate("'"$currentDate"'")}}' \ --out=/bin/dump/log_info.json
2. macOS 环境
macOS自带的date命令参数和Linux不同,生成变量的写法调整为:
# 生成UTC时区当天0点的标准ISODate格式字符串 currentDate=$(date -u -j +"%Y-%m-%dT00:00:00Z") # 生成UTC时区前一天0点的标准ISODate格式字符串 yesterdayDate=$(date -u -j -v-1d +"%Y-%m-%dT00:00:00Z")
后续mongoexport命令和Linux环境完全一致。
优化提示
如果你的查询范围是「当天全天数据」,建议把$lt的条件改为次日0点,避免用23:59:59遗漏毫秒级时间戳的记录:
# 生成次日0点的ISODate字符串(Linux示例) tomorrowDate=$(date -u -d "1 day" +"%Y-%m-%dT00:00:00Z")
内容的提问来源于stack exchange,提问作者Squall Lionheart
相关产品推荐
相关产品推荐

