Print
카테고리: [ NoSQL ]
조회수: 40207

mysql 의 mysqldump처럼 간단히 MongoDB collection을 OS dump file로 떨구거나
반대로 mysql < test.sql 처럼 쉽게 import 가 가능합니다.
이번 글에서는 나무 위키에서 제공하는 덤프파일로 import 후 export 받아보겠습니다.

mongoimport

https://namu.wiki/w/%EB%82%98%EB%AC%B4%EC%9C%84%ED%82%A4:%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%20%EB%8D%A4%ED%94%84

AL01542225:namuwiki_20170327.json nhn$ du -sh *namuwiki_20170327.json
7.1G    namuwiki_20170327.json

7.1GB ,93만 rows dump file
root@74fa1843c544:/data# mongoimport --db test --collection kimdubi_test --type json --drop --file ./namuwiki_20170327.json --jsonArray
2019-11-09T07:39:31.845+0000    connected to: mongodb://localhost/
2019-11-09T07:39:31.849+0000    dropping: test.kimdubi_test

2019-11-09T07:39:34.850+0000    [........................] test.kimdubi_test    48.0MB/7.08GB (0.7%)
2019-11-09T07:39:37.848+0000    [........................] test.kimdubi_test    90.5MB/7.08GB (1.2%)
2019-11-09T07:48:46.226+0000    [#######################.] test.kimdubi_test    7.08GB/7.08GB (100.0%)
2019-11-09T07:48:46.796+0000    [########################] test.kimdubi_test    7.08GB/7.08GB (100.0%)
2019-11-09T07:48:46.796+0000    931029 document(s) imported successfully. 0 document(s) failed to import.

=> mongoimport 에는 여러 option이 있는데 자주 사용하는 옵션으로는 db, collection 지정하는 --db , --collection
data type 지정하는 --type (default json , csv 도 가능) , import 하기 전 collection drop 하는 --drop
dump file의 위치를 지정하는 --file , 데이터가 json 내 array 형태로 있는 경우에 사용하는 --jsonArray 옵션이 있다.

root@74fa1843c544:/data# mongoimport -d test -c kimdubi_test2 --file=./namuwiki_20170327.json --type=json --drop --numInsertionWorkers=2 --jsonArray
2019-11-09T08:51:06.750+0000    connected to: mongodb://localhost/
2019-11-09T08:51:06.751+0000    dropping: test.kimdubi_test2
2019-11-09T08:51:09.753+0000    [........................] test.kimdubi_test2   51.8MB/7.08GB (0.7%)
2019-11-09T08:51:12.765+0000    [........................] test.kimdubi_test2   72.3MB/7.08GB (1.0%)
2019-11-09T08:51:15.762+0000    [........................] test.kimdubi_test2   100MB/7.08GB (1.4%)

=> numInsertionWorkers option으로 concurrency 하게 수행 가능

root@74fa1843c544:/data# mongoimport -d test -c kimdubi_test2 --file=./namuwiki_20170327.json --type=json --drop
2019-11-09T08:43:02.328+0000    connected to: mongodb://localhost/
2019-11-09T08:43:02.342+0000    dropping: test.kimdubi_test2
2019-11-09T08:43:05.340+0000    [........................] test.kimdubi_test2   256MB/7.08GB (3.5%)
2019-11-09T08:43:08.335+0000    [#.......................] test.kimdubi_test2   512MB/7.08GB (7.1%)
Killed

=> 실패


> db.kimdubi_test.stats()
{
    "ns" : "test.kimdubi_test",
    "size" : 4472188229,
    "count" : 931029,
    "avgObjSize" : 4803,
    "storageSize" : 2691452928,
    "capped" : false,

=> 압축 전 4.2GB size, 압축후 2.5GB 정도, 93만 row import 된 것 확인

mongoexport

root@74fa1843c544:/data# mongoexport -d test -c kimdubi_test -o kimdubi_test.json --type=json -f namespace,text
2019-11-09T09:05:13.572+0000    connected to: mongodb://localhost/
2019-11-09T09:05:14.576+0000    [........................]  test.kimdubi_test  0/931029  (0.0%)

=> mongoimport 와 옵션은 거의 동일하며 -f, --fields 옵션이 있는데 지정한 collection 의 특정 필드만 export 하겠다는 옵션
replicaSet, Sharded cluster 에서 수행 시 --uri 옵션으로 readPreference 지정하여 slave 쪽에서 수행 가능함
default 는 primary에서 수행

mongoexport --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/reporting?replicaSet=myReplicaSetName&readPreference=secondary" --collection=events --out=events.json [additional options]
mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &

=> -q query 조건 option 으로 os상에서 나눠 수행, 수행 가능 조건이 검증되었을 때 사용가능