Ошибка при создании запроса на экспорт Монго

Я получаю сообщение об ошибке при построении запроса с параметрами в 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, разбивая его, помогает мне понять, как его нужно (пере) записать одной строкой.

Другие вопросы по тегам