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

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

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

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

Ответы [ 6 ]

53 голосов
/ 14 августа 2011

Я решил это - волшебное заклинание, которое я искал:

mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
25 голосов
/ 15 января 2013

Более удобочитаемая версия, чем экранированная версия @ 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
13 голосов
/ 02 февраля 2016

В 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")}}

далее, используйте mongodump:

mongodump --db <dbName> --collection <collectionName> --queryFile query.json

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

7 голосов
/ 22 мая 2014

Редактировать: исправлены опечатки

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

  1. mongodump --query не поддерживает IsoDate, но принимает Date в форме миллисекунд.

  2. Поскольку команда 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"
      
  3. Используйте версию с одинарной кавычкой, чтобы избежать экранирования.

    mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
    
5 голосов
/ 09 августа 2011

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

mongodump --query  {"ts":{$gt:{$date:178929000}}}
4 голосов
/ 07 февраля 2014

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

mongodump --query  '{"ts":{$gt:{$date:178929000}}}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...