【问题标题】:Complex MongoDB syntax in Linux Shell scriptLinux Shell 脚本中的复杂 MongoDB 语法
【发布时间】:2013-11-01 12:53:06
【问题描述】:

我创建了一个每天备份数据库的 CRON 作业。

脚本有一个 Mongodump 命令,条件是转储 7 天前的记录。

脚本运行良好,直到我将--query 参数添加到mongodump 命令中。

mongodump [host, port and dbparams] --query "{_id: {\$lt: ObjectId(Math.floor(new Date(Date.now() - 86400000*7)/1000).toString(16) + '0000000000000000')}}" 

由于--query 引发的错误,其中显示:

assertion: 16619 code FailedToParse: FailedToParse: Expecting quoted string: offset:21

那么将这个查询集成到脚本中的正确方法是什么?

【问题讨论】:

  • 使用'$lt' 代替\$lt 有帮助吗?
  • @OneOfOne 不,没有'\''$lt' 给出错误'First character in field must be [A-Za-z$_]: offset:7'。我添加了 '\' 以逃避 $
  • @sohelkhalifa 我们可以在机器上不安装 mongo shell 的情况下运行脚本吗?

标签: linux mongodb shell


【解决方案1】:

您可以使用 shell 计算日期字符串,然后将其传递给 --query 选项。这是您的原始 Javascript 表达式和 shell 中的等效计算:

$ mongo --eval "Math.floor(new Date(Date.now() - 86400000*7)/1000).toString(16) + '0000000000000000'"
526a7ac00000000000000000
$ printf '%x0000000000000000' $(($(date +%s) - 86400*7))
526a7ac00000000000000000

然后您可以在一个简短的脚本中使用它,如下所示:

now=$(printf '%x0000000000000000' $(($(date +%s) - 86400*7)))
mongodump --query "{_id: {\$lt: '$now'}}"

希望这会有所帮助,

布鲁斯

【讨论】:

  • 布鲁斯的解决方案,简单一点:printf '%x0000000000000000' $(date --date='7 days ago' +%s)
  • 很好的改进拉法。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2010-11-05
  • 1970-01-01
  • 2012-05-12
相关资源
最近更新 更多