使用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
相关产品推荐
相关产品推荐

