Подтвердить что ты не робот

Как я могу использовать mongodump для выгрузки записей, соответствующих определенному диапазону дат?

Я пытаюсь использовать команду mongodump, чтобы выгрузить кучу записей, созданных в определенную дату. Записи включают поле "ts", которое является объектом MongoDB Date().

mongodump принимает аргумент -q, который может использоваться для запуска запроса для выбора записей, которые должны быть включены в дамп. К сожалению, аргумент -q должен быть предоставлен в JSON, и неясно, как выражать запрос "меньше, чем этот, более чем этот" в чистом JSON (обычно такие запросы будут использовать ' новый конструктор Date())

Какие-нибудь советы? Я пробовал использовать формат {$ date: unix-timestamp-in-milliseconds}, но он не работает для меня.

4b9b3361

Ответ 1

Я решил это - магическое заклинание, которое я искал, это:

mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"

Ответ 2

Более удобная для человека версия, чем версия с экранированной версией @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

Ответ 3

В 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

простой и понятный.

Ответ 4

Изменить: фиксированные опечатки

Добавить обновление:

  • 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) } }'
    

Ответ 5

Это должно работать, что не работает с вашим запросом $date?:

mongodump --query  {"ts":{$gt:{$date:178929000}}}

Ответ 6

используйте одинарные кавычки вокруг запроса. Я обнаружил, что ISODate() не работает.

mongodump --query  '{"ts":{$gt:{$date:178929000}}}'

Ответ 7

В моем случае я запросил записи, созданные 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