Монго Экспорт дампа коллекций, вставленных после определенного дня и времени
Я пытаюсь сбросить все записи, сделанные в 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})"}}'
- Я запускаю этот скрипт на сервере CentOS+MongoDB.
- Я протестировал команду 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})}}"