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

使用mongoexport按日期查询返回错误结果的技术问询

解决mongoexport日期查询条件失效问题

问题原因

你原命令中用单引号包裹查询条件,虽然${isodate}变量能被shell替换,但MongoDB接收到的查询里,$date被当成了普通JSON键而非BSON日期的标识,导致日期比较逻辑完全不生效——相当于只查询存在createdDate字段的文档,所以会返回所有包含该字段的记录,包括2020年的旧数据。

修正方案

方案1:转义双引号包裹查询条件

把查询的单引号换成双引号,同时对JSON内部的双引号和$符号进行转义(避免shell解析$gte、$lte为变量):

isodate=$(date -d '-1 day' '+%Y-%m-%d')
mongoexport --uri "mongodb://user_name:password@my_ip:my_port/my_db_name?ssl=false&authSource=admin" \
--collection=Test \
-q "{\"createdDate\": {\"\$gte\": { \"\$date\": \"${isodate}T00:00:00.000Z\" }, \"\$lte\": { \"\$date\": \"${isodate}T23:59:59.999Z\" }}}" \
--out=$data_path/${run_date}/test.json

方案2:用jq生成标准JSON查询(推荐)

借助jq工具自动生成正确的JSON字符串,避免手动转义出错:

isodate=$(date -d '-1 day' '+%Y-%m-%d')
# 用jq构建查询JSON并去除换行
query=$(jq -n --arg date "$isodate" '{createdDate: {$gte: {$date: $date+"T00:00:00.000Z"}, $lte: {$date: $date+"T23:59:59.999Z"}}}' | tr -d '\n')
mongoexport --uri "mongodb://user_name:password@my_ip:my_port/my_db_name?ssl=false&authSource=admin" \
--collection=Test \
-q "$query" \
--out=$data_path/${run_date}/test.json

方案3:使用ISODate构造函数

直接用MongoDB的ISODate()构造日期对象,同样注意转义:

isodate=$(date -d '-1 day' '+%Y-%m-%d')
mongoexport --uri "mongodb://user_name:password@my_ip:my_port/my_db_name?ssl=false&authSource=admin" \
--collection=Test \
-q "{\"createdDate\": {\"\$gte\": ISODate(\"${isodate}T00:00:00.000Z\"), \"\$lte\": ISODate(\"${isodate}T23:59:59.999Z\")}}" \
--out=$data_path/${run_date}/test.json

内容的提问来源于stack exchange,提问作者Code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:06