Монго Экспорт дампа коллекций, вставленных после определенного дня и времени

Я пытаюсь сбросить все записи, сделанные в MongoDB с полуночи каждый день. Я создал скрипт Unix, который использует utlity "mongoexport". Он возвращает ноль записей. Вот команды.

# Generate a variable that stores today's date and 00:00 hours in epoch format
toDay=$(date +%Y-%m-%d)
todayMidnightEpoch=$(date -d "${toDay} 00:00:00" "+%s")

# Now plug this epoch variable into mongoexport command
mongoexport \
--host <hostname> \
--username <user ID> \
--password <password> \
--db <db name> \
--limit 100000 \
--collection <collection name> \
--out filename-$(date +%Y%m%d).json \
--query '{created_at:{"$gte": "new Date(${todayMidnightEpoch})"}}'
  1. Я запускаю этот скрипт на сервере CentOS+MongoDB.
  2. Я протестировал команду mongoexport без опции запроса и почти сразу получил вывод всех документов.

Я получаю ноль записей после запуска более 10-20 минут. Когда я выполняю тот же "запрос" с заменой переменной на фактическое значение эпохи в Mongo Shell, я сразу получаю правильный вывод.

db.<collection name>.find('{"created_at":{"$gte":new Date(140013360000000)}}')

Даже когда я жестко закодировал значение эпохи в команде mongoexport, я получил одну запись.

mongoexport --host <hostname> --username <username> --password <password> --db <db name> --limit 10 --collection <coll name> --out test-$(date +%Y%m%d).json --query '{created_at:{$gte:new Date(1431561600000)}}'

Вопросы:

  • Почему он возвращает записи (или документы), когда запрос выполняется с жестко запрограммированным значением эпохи в оболочке mongo, а не когда он передается через переменную unix в утилите mongoexport?
  • Есть ли способ указать сегодняшнюю дату и время как 00:00:00 в опции запроса без необходимости конвертировать их в формат эпохи?

1 ответ

Вы должны изменить свое время эпохи так:

newtodayMidnightEpoch=$(($todayMidnightEpoch*1000))

Вам нужно изменить строку запроса на это:

--query "{created_at:{\"\$gte\": new Date(${newtodayMidnightEpoch})}}"

Вы должны использовать двойные кавычки, а не одинарные кавычки вокруг всей строки, так как одинарные кавычки предотвращают подстановку переменных, а затем вам нужно удалить двойные кавычки вокруг новой даты (строки, так как это неверный синтаксис. Вам также нужно передавать эпоху в миллисекундах, а не секунд. Когда я делаю это изменение плюс экранирование двойных кавычек около $gte с обратной косой чертой, это прекрасно работает для меня.

Таким образом, полный новый скрипт будет:

# Generate a variable that stores today's date and 00:00 hours in epoch format
toDay=$(date +%Y-%m-%d)
todayMidnightEpoch=$(date -d "${toDay} 00:00:00" "+%s")
newtodayMidnightEpoch=$(($todayMidnightEpoch*1000))


# Now plug this epoch variable into mongoexport command
mongoexport \
--host <hostname> \
--username <user ID> \
--password <password> \
--db <db name> \
--limit 100000 \
--collection <collection name> \
--out filename-$(date +%Y%m%d).json \
--query "{created_at:{\"\$gte\": new Date(${newtodayMidnightEpoch})}}"
Другие вопросы по тегам