programing

mongodump를 사용하여 특정 날짜 범위에 일치하는 레코드를 덤프하려면 어떻게 해야 합니까?

bestprogram 2023. 3. 23. 23:16

mongodump를 사용하여 특정 날짜 범위에 일치하는 레코드를 덤프하려면 어떻게 해야 합니까?

mongodump 명령어를 사용하여 특정 날짜에 작성된 많은 레코드를 폐기하려고 합니다.레코드에는 MongoDB Date() 객체인 "ts" 필드가 포함됩니다.

mongodump는 -q 인수를 사용합니다.이 인수를 사용하여 덤프에 포함할 레코드를 선택하는 쿼리를 실행할 수 있습니다.안타깝게도 -q 인수는 JSON에서 제공해야 하며 순수 JSON에서 "이 날짜보다 작음, 이 날짜보다 더" 쿼리를 표현하는 방법은 명확하지 않습니다(보통 이러한 쿼리는 "새로운 날짜()" 생성자를 사용합니다).

팁이 있나요?{$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}}}"

@SimonWilison의 이스케이프 버전보다 더 사람이 읽을 수 있는 버전:

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

다음으로 mongodump를 사용합니다.

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

간단 명료.

편집: 오탈자 수정

업데이트 추가:

  1. mongodump --query서포트하지 않음IsoDate단, 받아들입니다.Date밀리초 단위로 표시됩니다.

  2. ~하듯이dateOS 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) } }'
    

이것으로 충분합니다. $date 쿼리에 대해 어떤 점이 효과가 없었습니까?:

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

쿼리 주위에 작은 따옴표를 사용합니다.ISODate()가 동작하지 않는 것을 알았습니다.

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

확장 JSON 포맷은 매뉴얼(https://docs.mongodb.com/database-tools/mongodump/)에서 확인할 수 있듯이 기능합니다.예를 들어:

--query '{ "timest": { "$gte": { "$date": "2020-08-19T00:00:00.000Z" } } }'

이 경우 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

언급URL : https://stackoverflow.com/questions/6996999/how-can-i-use-mongodump-to-dump-out-records-matching-a-specific-date-range