Ошибка при создании запроса на экспорт Монго
Я получаю сообщение об ошибке при построении запроса с параметрами в 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})}}\''
Обновлено: set -x очень помог. Одна вещь, которую я узнал, не полагайтесь на эхо-операторы для отладки.
#!/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 ответ
В таких ситуациях мне легче диктовать $
расширение, которое я хочу и не хочу (и читать мой сценарий), если я разбиваю строковую конструкцию на несколько строк, например:
query='{updatedTimestamp : {$gte : ISODate('
query=${query}${sDate}
query=${query}'), $lt : ISODate('
query=${query}${eDate}
query=${query}')}}'
Если нужен синтаксис MongoDB '
кавычки вокруг дат, вы можете добавить строки, подобные этой, до и после строк, которые объединяют даты в строку:
query=${query}"'"
или сделайте что-то вроде этого:
query=${query}"'), \$lt : ISODate('"
Иногда я снова объединяю несколько строк в одну, как только вижу, что многострочная версия работает; IOW, разбивая его, помогает мне понять, как его нужно (пере) записать одной строкой.