Linux Shell脚本中的复杂MongoDB语法

Linux Shell脚本中的复杂MongoDB语法,linux,mongodb,shell,Linux,Mongodb,Shell,我创建了一个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')}}" 由于-

我创建了一个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

那么,将此查询集成到脚本中的正确方法是什么呢?

您可以使用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'}}"
希望这有帮助


Bruce

是否使用
'$lt'
而不是
\$lt
帮助?@其中一个错误是,不带
'\'
'$lt'
给出错误
'字段中的第一个字符必须是[A-Za-z$\]:偏移量:7'
。我添加了
'\'
以避开
$
。Bruce的解决方案更简单一些:
printf'%x0000000000000000'$(date--date='7天前'+%s)
很好的改进Rafa。