Ответ 1
Я решил это - магическое заклинание, которое я искал, это:
mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
Я пытаюсь использовать команду mongodump, чтобы выгрузить кучу записей, созданных в определенную дату. Записи включают поле "ts", которое является объектом MongoDB Date().
mongodump принимает аргумент -q, который может использоваться для запуска запроса для выбора записей, которые должны быть включены в дамп. К сожалению, аргумент -q должен быть предоставлен в JSON, и неясно, как выражать запрос "меньше, чем этот, более чем этот" в чистом JSON (обычно такие запросы будут использовать ' новый конструктор Date())
Какие-нибудь советы? Я пробовал использовать формат {$ date: unix-timestamp-in-milliseconds}, но он не работает для меня.
Я решил это - магическое заклинание, которое я искал, это:
mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
Более удобная для человека версия, чем версия с экранированной версией @SimonWillison:
--query "{ time: { \$gt: new Date(1312959600000), \$lt: new Date(1313046000000) }}"
(Обратите внимание на то, что все равно нужно вытеснять доллары.)
Я получил миллисекундные метки времени, создав даты в оболочке, например:
> var targetDateStart = new Date(2011, 7, 10);
> var targetDateEnd = new Date(2011, 7, 11);
> targetDateStart.getTime();
1312959600000
> targetDateEnd.getTime();
1313046000000
В MongoDB 3.2 мы можем использовать опцию --queryFile
с mongodump.
Прежде всего, создайте json файл:
//query.json
{"serverTime": {"$gte": ISODate("2016-01-30T16:00:00.000Z"), "$lt": ISODate("2016-01-31T16:00:00.000Z")}}
next, используйте mongodump:
mongodump --db <dbName> --collection <collectionName> --queryFile query.json
простой и понятный.
Изменить: фиксированные опечатки
Добавить обновление:
mongodump --query
не поддерживает IsoDate
, но принимает Date
в миллисекундах.
Поскольку команда Date
ведет себя по-разному в OS X, date -d 2011-08-10 +%s
не работает для меня. Если вы столкнулись с одной и той же проблемой, попробуйте прочитать руководство или использовать это:
Получить текущее время в секундах:
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
Получить определенное время в секундах:
date -j -f "%Y-%m-%d %H:%M:%S" "2014-01-01 00:00:00" "+%s"
Используйте версию одиночной кавычки, чтобы избежать экранирования.
mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
Это должно работать, что не работает с вашим запросом $date?:
mongodump --query {"ts":{$gt:{$date:178929000}}}
используйте одинарные кавычки вокруг запроса. Я обнаружил, что ISODate() не работает.
mongodump --query '{"ts":{$gt:{$date:178929000}}}'
В моем случае я запросил записи, созданные 14 дней назад, и получил скрипт bash:
#!/bin/bash
date_now='date +%s%3N'
date_2weeks_ago=$[date_now - 14 * 24 * 60 * 60 * 1000]
query=$(printf '{ createdAt: { $gte: Date(%d) } }' $date_2weeks_ago)
echo $query > query.json
mongodump \
--collection=data \
--queryFile=query.json
rm query.json
версия mongodump: r4.0.12