首页 > 解决方案 > 如何将 shell 值解析为 mongoexport

问题描述

我正在开发一个 shell 脚本,它将执行 mongoexport 并将其上传到 S3 存储桶。目标是将日期提取为 45 天前数据的可读 JSON 格式。脚本将作为 crontab 每天运行。

所以基本上目的是归档超过 45 天的数据

正常查询可以正常工作,但是当我尝试使用变量时会导致错误。

代码常规格式如下:

firstdate="$(date -v-46d +%Y-%m-%d)"
afterdate="$(date -v-45d +%Y-%m-%d)"
backup_name=gamebook
colname=test1

mongoexport --uri mongodb+srv://<user>:<pass>@gamebookserver.tvdmx.mongodb.net/$dbname
--collection $colname --query '{"gameDate": {"$gte": {"$date": "2020-09-04T00:00:00:000Z"}, "$lte": {"$date": "2020-09-05T00:00:00.000Z"}}}' --out $backup_name;

前面的代码有效,但我想让它在日期中更加动态,所以我尝试了如下所示的代码:

firstdate="$(date -v-46d +%Y-%m-%d)"
afterdate="$(date -v-45d +%Y-%m-%d)"
backup_name=gamebook
colname=test1

mongoexport --uri mongodb+srv://<user>:<pass>@gamebookserver.tvdmx.mongodb.net/$dbname
--collection $colname --query '{"gameDate": {"$gte": {"$date": "$firstdateT00:00:00:000Z"}, "$lte": {"$date": "$afterdateT00:00:00.000Z"}}}' --out $backup_name;

这会导致错误:

2020-10-20T15:36:13.881+0700查询'[123 34 103 97 109 101 68 97 116 101 34 58 32 123 34 32 123 34 36 103 116 101 34 58 32 123 34 58 32 123 34 36 1001 115 116 100 97 116 101 84 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 90 125 44 32 32 32 34 36 108 116 106 101 34 58 32 123 32 123 34 36 100 97 116 101 34 58 116 101 84 48 48 58 48 48 58 48 48 46 48 48 48 90 34 125 125 125]' 无效 JSON:无效字符 '$' 寻找值的开头 2020-10-20T15:36:13.881+0700 尝试' mongoexport --help' 了解更多信息

我已经阅读了文档,它说:

您必须将查询文档用单引号 ('{ ... }') 括起来,以确保它不会与您的 shell 环境交互。

所以我的总体问题是,有没有办法在 shell 环境中使用值并将它们解析到查询部分?

或者有没有更好的方法可以让我得到同样的结果?

一般来说,我对 mongodb 还是很陌生,所以任何建议都会很棒。

标签: linuxmongodbshell

解决方案


您总是可以通过组合插值和非插值部分来组合一个字符串:

例如,

--query '{"gameDate": {"$gte": {"'"$date"'": "'"$firstdate"'T00:00:00:000Z"}, "$lte": {"$date": "$afterdateT00:00:00.000Z"}}}'

将插入date和 shell 变量的第一次出现firstdate,但将其余部分按字面意思传递给 mongoexport (我选择了两个变量进行演示,因为我从你的问题中不明白,你想扩展哪些,你不不想)。基本上,一个

'$AAAA'"$BBBB"'$CCCCC'

实际上是单个字符串,但 $BBBB 部分将进行参数扩展。因此,如果

BBBB=foo

你会从中得到文字字符串$AAAAfoo$CCCCC

由于这变得乏味,另一种方法是将所有内容括在双引号中,这意味着所有参数都被扩展,并手动转义那些您不想扩展的部分。您也可以将最后一个示例编写为

"\$AAAA$BBBB\$CCCCC"

推荐阅读