构造mongo导出查询时出错

时间:2018-07-26 15:56:25

标签: bash mongodb shell ubuntu-14.04 mongoexport

在bash脚本中使用参数构建查询时,我不断出错 没有任何参数,我就能导出记录。但是转义特殊字符似乎非常困难。

    cname="CollectionName"
    dbname="DBName"
    startDate=2018-08-01
    endDate=2018-08-02
    sDate=$(date -d "$startDate" '+%Y-%m-%dT%H:%M:%S.%3NZ' )
    eDate=$(date -d "$endDate" '+%Y-%m-%dT%H:%M:%S.%3NZ')
    query="'{"updatedTimestamp" : {$gte : ISODate('${sDate}'), $lt : ISODate('${midDate}')}}"
    mongoexport --host <hostname> --port <portname> --authenticationMechanism PLAIN --authenticationDatabase \$external --username <username>--password <password> --collection ${cname} --db ${dbname} --query ${query} --out out.json


./mongo_export_s3_upload.sh: line 26: syntax error near unexpected token `('
./mongo_export_s3_upload.sh: line 26: `query=\'{"updatedTimestamp":{\"\$gte\": new Date(${sDate})}}\''

已更新: 设置-x很有帮助。我学到的一件事是,不要依赖echo​​语句进行调试。

#!/bin/bash
set -x
 cname="CollectionName"
    dbname="DBName"
endDate="2018-08-02"
sDate=$(date -d "$startDate" '+%Y-%m-%dT%H:%M:%S.%3NZ' )
eDate=$(date -d "$endDate" '+%Y-%m-%dT%H:%M:%S.%3NZ')
query='{"updatedTimestamp":{$gte:ISODate("'${sDate}'"),$lt:ISODate("'${eDate}'")}}'
mongoexport --host <hostname> --port <portname> --authenticationMechanism PLAIN  --authenticationDatabase \$external --username <username>--password <password>  --collection ${cname} --db ${dbname} -q ${query} --out out.json

1 个答案:

答案 0 :(得分:1)

在这种情况下,如果将字符串结构分成几行,我会更容易决定我想要和不想要的$扩展名(并阅读脚本):

query='{updatedTimestamp : {$gte : ISODate('
query=${query}${sDate}
query=${query}'), $lt : ISODate('
query=${query}${eDate}
query=${query}')}}'

如果MongoDB语法需要在日期周围加上'引号,则可以在将日期连接到字符串的行的前后添加这样的行:

query=${query}"'"

或者,执行以下操作:

query=${query}"'), \$lt : ISODate('"

有时候,一旦我看到多行版本有效,我便将多行重新组合为一行。 IOW,将其分解可以帮助我了解如何将其写为一行。