source

컬렉션에서 마지막 "x"개의 레코드를 몽고 덤프할 수 있습니까?

lovecheck 2023. 5. 7. 11:33
반응형

컬렉션에서 마지막 "x"개의 레코드를 몽고 덤프할 수 있습니까?

mongodump를 사용하여 컬렉션에서 최신 "x"개의 문서를 덤프할 수 있습니까?예를 들어 mongo 셸에서 다음을 실행할 수 있습니다.

db.stats.find().sort({$natural:-1}).limit(10);

mongodump에서도 동일한 기능을 사용할 수 있습니까?

해결 방법은 위의 문서를 새로운 임시 컬렉션에 덤프하고 전체 임시 컬렉션을 몽고 덤프하는 것이지만, 몽고 덤프를 통해 이 작업을 수행할 수 있으면 좋을 것 같습니다.

잘 부탁드립니다.

마이클.

mongodump커서 인터페이스가 완전히 노출되지 않습니다.하지만 당신은 그것을 피할 수 있습니다, 사용합니다.--query매개 변수먼저 컬렉션의 총 문서 수를 가져옵니다.

db.collection.count()

10000개의 문서가 있고 당신이 마지막 1000개를 원한다고 치자.이렇게 하려면 덤프할 첫 번째 문서의 ID를 가져옵니다.

db.collection.find().sort({_id:1}).skip(10000 - 1000).limit(1)

이 예에서 ID는"50ad7bce1a3e927d690385ec"이제 먹이를 줄 수 있습니다.mongodump이 정보를 사용하여 ID가 더 높거나 같은 모든 문서를 덤프합니다.

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gte: ObjectId("50ad7bce1a3e927d690385ec")}}'

UPDATE 새 매개 변수--limit그리고.--skip에 추가되었습니다.mongoexport다음 버전의 도구에서 사용할 수 있습니다. https://github.com/mongodb/mongo/pull/307

Mic92의 답변을 바탕으로 컬렉션에서 최신 1000개 항목을 확인할 수 있습니다.

찾기_id1000번째 가장 최근의 항목 중:

db.collection.find('', {'_id':1}).sort({_id:-1}).skip(1000).limit(1)

그것은 다음과 같은 것이 될 것입니다.50ad7bce1a3e927d690385ec.

그런 다음 쿼리에서 이 _id를 mongodump에 전달합니다.

$ mongodump -d 'your_database' -c 'your_collection' -q '{"_id": {"$gt": {"$oid": "50ad7bce1a3e927d690385ec"}}}'

mongodump는 --mongdump 연산자를 지원합니다.쿼리를 json 쿼리로 지정할 수 있는 경우 이를 수행할 수 있습니다.

그렇지 않은 경우 쿼리를 실행하여 레코드를 임시 컬렉션에 덤프한 다음 덤프하는 방법이 제대로 작동합니다.이 경우 javascript 명령으로 mongo를 호출하여 원하는 작업을 수행한 다음 mongo를 호출하는 셸 스크립트를 사용하여 덤프를 자동화할 수 있습니다.

비슷한 요구사항(mongodump 사용)을 사용하여 순차적 백업 및 복원을 수행했습니다.마지막으로 저장된 타임스탬프에서 덤프를 가져옵니다.--query '{ TIMESTAMP : {$gte : $time, $lt : $etime } }'을(를) 연결할 수 없습니다.

몇 가지 주의할 점: 1) 이중 대신 단일 따옴표 사용 2) $ 또는 아무것도 이스케이프하지 않음 3) $time/$etime을 실수로 대체하면 쿼리가 작동하게 됩니다 4) mongodump가 자체 실행되기 전에 $time/$etime을 해결하는 데 문제가 있었습니다. 이 문제는 + eval mongodump --query '{\gte:$utc_time,\$lt:$utc_etime}' ++ mongodump --'{TIMestamp:$gte:1366700243}' '{TIMestamp:$lt:1366700253}'을(를) 쿼리합니다.

이런, 문제는 분명했습니다.쿼리가 두 가지 조건으로 변환됩니다.

해결책이 까다롭고 반복적인 시도 끝에 얻은 건데….이스케이프 { 및 }({...} 사용). 이렇게 하면 문제가 해결됩니다.

사용해 보십시오.

NUM=10000    
doc=selected_doc
taskid=$(mongo 127.0.0.1/selected_db -u username -p password --eval "db.${doc}.find({}, {_id: 1}).sort({_id: -1}).skip($NUM).limit(1)" |  grep -E  -o '"[0-9a-f]+"')
mongodump --collection $doc  --db selected_db --host 127.0.0.1 -u username -p password -q "{_id: {\$gte: $taskid}}" --out ${doc}.dump

_id사용자 지정을 사용하는 경우 기반 접근 방식이 작동하지 않을 수 있습니다._id(타사 API에 의해 반환되는 등) 수집을 위해 사용됩니다.이 경우, 당신은 다음에 의존해야 합니다.createdAt또는 동등한 필드:

COL="collectionName"
HOW_MANY=10000

DATE_CUTOFF=$(mongo <host, user, pass...> dbname --quiet \
--eval "db.$COL.find({}, { createdAt: 1 }).sort({ createdAt: -1 }).skip($HOW_MANY).limit(1)"\
| grep -E -o '(ISODate\(.*?\))')

echo "Copying $HOW_MANY items after $DATE_CUTOFF..."

mongodump <host, user, pass...> -d dbname -c ${COL}\
-q "{ createdAt: { \$gte: $DATE_CUTOFF} }" --gzip

전략은 간단하지만 이를 수행하는 데는 몇 가지 어려움이 있습니다.우리가 사용하고 있다고 가정합니다._id그러기 위한 필드.그리고 우리는 압니다._id필드는 증분이므로 최근 문서를 찾는 데 유용한 지표입니다.

  1. 컬렉션에서 X'번째 레코드 찾기
  2. 을 합니다._id
  3. 을 합니다._id에 출전하다.mongodump --query

컬렉션에서 X'번째 레코드 찾기

다음을 사용하여 이를 달성할 수 있습니다.--eval와 함께mongo 공구, 공구

  • 최신 문서를 오래된 문서로 정렬
  • 제한 X 레코드 역순 정렬
  • 첫 번째 문서 작성(제한:1)
  • stringify Id
mongo --host=$mongodb_uri --quiet --eval db.myCollection.aggregate([{\$sort:{_id:-1}},{\$limit:$MAX_DOCUMENT},{\$sort:{_id:1}},{\$limit:1},{\$project:{_id:{\$toString:\"\$_id\"}}}]) 

timeout ={ "_id" : "62440d84c18a957093f6c8a3" }

문서의 _id 필드 추출

_id의 정확한 값이 필요하므로 정규식을 수행합니다.

$(echo $result | sed -e 's/{ "_id" : "\(.*\)" }/\1/')

lastId=62440d84c18a957093f6c8a3

을 합니다._id에 출전하다.mongodump --query

하지 않으므로 mongodump " ObjectId"를 .$oidObjectId 필드를 나타냅니다.

query="{\"_id\":{\"\$gte\":{\"\$oid\":\"$lastId\"}}}"

다음은 전체 bash 스크립트입니다.


dump()
{
    local lastIdQuery="db.$collection.aggregate([{\$sort:{_id:-1}},{\$limit:$MAX_DOCUMENT},{\$sort:{_id:1}},{\$limit:1},{\$project:{_id:{\$toString:\"\$_id\"}}}])"
    echo "lastIdQuery $lastIdQuery"
    local lastIdResult=$(mongo --host=$mongodb_uri --quiet --eval "$lastIdQuery")
    echo "lastIdResult $lastIdResult"
    local lastId=$(echo $lastIdResult | sed -e 's/{ "_id" : "\(.*\)" }/\1/')
    echo $lastId
    query="{\"_id\":{\"\$gte\":{\"\$oid\":\"$lastId\"}}}"
    echo "query $query"
    mongodump --uri=$mongodb_uri   --collection $collection --query="$query" --out=$outFolder
}


mongodb_uri='mongodb://localhost:27017/myDb'
outFolder=./backup
MAX_DOCUMENT=100
collection="users"

dump

언급URL : https://stackoverflow.com/questions/7828817/is-it-possible-to-mongodump-the-last-x-records-from-a-collection

반응형