소개
이 랩에서는 MongoDB 데이터베이스에서 데이터를 내보내기 위해 mongoexport 명령줄 유틸리티를 사용하는 방법을 배우게 됩니다. JSON 및 CSV 의 두 가지 일반적인 형식으로 데이터를 내보내는 연습을 하게 됩니다. 이 랩에서는 샘플 데이터셋을 만들고, 전체 컬렉션을 내보내고, 내보낼 특정 필드를 선택하고, 쿼리를 사용하여 내보낼 데이터를 필터링하는 과정을 안내합니다. 이 랩이 끝나면 백업, 분석 또는 다른 시스템으로의 마이그레이션을 위해 MongoDB 에서 데이터를 추출하는 데 능숙해질 것입니다.
컬렉션을 JSON 으로 내보내기
첫 번째 단계에서는 MongoDB 컬렉션을 JSON 파일로 내보내는 기본적인 과정을 배우게 됩니다. JSON(JavaScript Object Notation) 은 MongoDB 문서의 풍부하고 중첩된 구조를 유지하는 표준 형식으로, 백업 및 마이그레이션에 이상적입니다.
먼저 MongoDB 서버에 연결하고 샘플 데이터를 생성해야 합니다. 터미널에서 다음 명령을 실행하여 MongoDB Shell 을 엽니다.
mongosh
MongoDB Shell 에 들어가면 새로운 프롬프트가 표시됩니다. 이제 exportlab이라는 새 데이터베이스를 생성하고 전환한 다음, users 컬렉션에 세 개의 문서를 삽입합니다.
use exportlab
db.users.insertMany([
{ name: "Alice", age: 28, email: "alice@example.com", status: "active" },
{ name: "Bob", age: 35, email: "bob@example.com", status: "active" },
{ name: "Charlie", age: 42, email: "charlie@example.com", status: "inactive" }
]);
문서가 삽입된 후 확인 메시지가 표시됩니다. 이제 MongoDB Shell 을 종료하여 일반 터미널로 돌아갑니다.
exit;
데이터가 준비되었으므로 이제 mongoexport 유틸리티를 사용하여 users 컬렉션을 내보낼 수 있습니다. 이 명령은 데이터베이스, 컬렉션 및 출력 파일을 지정합니다.
mongoexport --db=exportlab --collection=users --out=$HOME/project/users.json
--db: 연결할 데이터베이스 (exportlab) 를 지정합니다.--collection: 내보낼 컬렉션 (users) 을 지정합니다.--out: 출력 파일의 경로와 파일 이름 ($HOME/project/users.json) 을 지정합니다.
내보내기가 성공했는지 확인하려면 새로 생성된 JSON 파일의 내용을 확인합니다.
cat ~/project/users.json
삽입한 세 개의 문서가 각각 새 줄에 JSON 형식으로 표시되는 것을 볼 수 있습니다. 이 형식은 JSONL(JSON Lines) 이라고 하며, 각 줄에는 별도의 완전한 JSON 객체가 포함됩니다. MongoDB 는 각 문서에 고유한 _id 필드를 추가한다는 점에 유의하십시오.
{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Charlie","age":42,"email":"charlie@example.com","status":"inactive"}
컬렉션을 CSV 로 내보내기
JSON 은 데이터 구조를 보존하는 데 탁월하지만, CSV(Comma-Separated Values) 는 스프레드시트에서 사용하거나 간단한 데이터 교환에 더 편리한 경우가 많습니다. 이 단계에서는 동일한 users 컬렉션을 CSV 파일로 내보내게 됩니다.
CSV 로 내보낼 때는 포함할 필드를 지정해야 합니다. 이는 CSV 가 평면적인 테이블 형식이며 중첩된 JSON 구조를 표현할 수 없기 때문입니다.
다시 mongoexport 명령을 사용하되, 이번에는 --type=csv 및 --fields 옵션을 추가합니다. name, age, email 필드를 내보낼 것입니다.
mongoexport --db=exportlab --collection=users --type=csv --fields=name,age,email --out=$HOME/project/users.csv
--type=csv: 이 플래그는mongoexport에 CSV 형식으로 출력하도록 지시합니다.--fields: 내보내기에 포함할 필드의 쉼표로 구분된 목록입니다. 여기에 나열된 순서에 따라 CSV 파일의 열 순서가 결정됩니다.
이제 users.csv 파일의 내용을 검사합니다.
cat ~/project/users.csv
출력은 필드 이름을 헤더 행으로 하고 그 뒤에 데이터가 오는 표준 CSV 형식입니다.
name,age,email
Alice,28,alice@example.com
Bob,35,bob@example.com
Charlie,42,charlie@example.com
이제 동일한 데이터를 두 가지 다른 형식으로 성공적으로 내보냈습니다.
쿼리로 데이터 필터링하기
전체 컬렉션을 내보낼 필요가 없는 경우가 많습니다. mongoexport를 사용하면 쿼리를 사용하여 내보낼 문서를 필터링할 수 있습니다. 이는 데이터의 특정 하위 집합을 추출하는 데 유용합니다.
이 단계에서는 status가 "active"인 사용자만 내보냅니다. --query 옵션은 MongoDB Shell 의 find() 작업과 마찬가지로 필터 기준을 지정하는 JSON 문서를 받습니다.
다음 명령을 실행하여 활성 사용자만 active_users.json이라는 새 JSON 파일로 내보냅니다.
mongoexport --db=exportlab --collection=users --query='{"status": "active"}' --out=$HOME/project/active_users.json
--query='{"status": "active"}': 이 옵션은 문서를 필터링하여status필드가"active"와 같은 문서만 내보냅니다. 셸 해석 문제를 방지하기 위해 JSON 문자열 주위에 작은따옴표를 사용하는 것에 유의하십시오.
내보낸 파일의 내용을 확인해 보겠습니다.
cat ~/project/active_users.json
Charlie 의 상태가 "inactive"이므로 출력에는 Alice 와 Bob 의 문서만 포함되어야 합니다.
{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}
이러한 필터링 기능은 데이터를 내보낸 후 조작할 필요 없이 대상 데이터 내보내기를 만드는 데 강력합니다.
출력 형식 지정 및 제한
mongoexport는 내보내는 데이터의 형식과 양을 제어하는 추가 옵션을 제공합니다. 이 단계에서는 더 읽기 쉬운 "pretty" JSON 출력을 만드는 방법과 내보내기 문서 수를 제한하는 방법을 배우게 됩니다.
먼저 users 컬렉션을 다시 내보내되, 이번에는 --pretty 플래그를 사용합니다. 이렇게 하면 JSON 출력이 들여쓰기와 줄 바꿈으로 서식이 지정되어 훨씬 읽기 쉬워집니다.
mongoexport --db=exportlab --collection=users --pretty --out=$HOME/project/users_pretty.json
--pretty: 출력을 사람이 읽을 수 있는 형식으로 지정합니다.
서식이 지정된 파일을 확인하여 차이를 살펴보겠습니다.
cat ~/project/users_pretty.json
출력은 다음과 같이 보기 좋게 들여쓰기됩니다.
[
{
"_id": {
"$oid": "656f1a6b..."
},
"name": "Alice",
"age": 28,
"email": "alice@example.com",
"status": "active"
},
{
"_id": {
"$oid": "656f1a6b..."
},
"name": "Bob",
"age": 35,
"email": "bob@example.com",
"status": "active"
},
{
"_id": {
"$oid": "656f1a6b..."
},
"name": "Charlie",
"age": 42,
"email": "charlie@example.com",
"status": "inactive"
}
]
다음으로 --limit 옵션을 사용하여 특정 수의 문서만 내보냅니다. 이는 작은 샘플 파일을 만들거나 테스트하는 데 유용합니다. 처음 두 문서만 CSV 파일로 내보내 보겠습니다.
mongoexport --db=exportlab --collection=users --type=csv --fields=name,status --limit=2 --out=$HOME/project/users_limited.csv
--limit=2: 내보내기를 최대 2 개의 문서로 제한합니다.
제한된 CSV 파일의 내용을 확인합니다.
cat ~/project/users_limited.csv
예상대로 파일에는 헤더와 처음 두 개의 사용자 레코드만 포함됩니다.
name,status
Alice,active
Bob,active
내보낸 파일 확인
마지막 단계에서는 이전에 생성한 파일을 검사하고 확인하기 위해 일반적인 Linux 명령줄 도구를 사용하는 연습을 합니다. 이는 데이터 내보내기의 무결성을 확인하는 데 중요한 기술입니다.
먼저 프로젝트 디렉터리의 모든 파일을 나열하여 생성한 모든 항목을 확인합니다. -lh 플래그는 사람이 읽을 수 있는 형식으로 세부 정보를 표시합니다.
ls -lh ~/project/
이전 단계에서 생성한 모든 .json 및 .csv 파일을 볼 수 있습니다.
total 20K
-rw-rw-r-- 1 labex labex 224 Aug 27 15:48 active_users.json
-rw-rw-r-- 1 labex labex 96 Aug 27 15:48 users.csv
-rw-rw-r-- 1 labex labex 344 Aug 27 15:36 users.json
-rw-rw-r-- 1 labex labex 36 Aug 27 15:48 users_limited.csv
-rw-rw-r-- 1 labex labex 410 Aug 27 15:48 users_pretty.json
다음으로 wc -l 명령을 사용하여 파일의 줄 수를 셉니다. 이는 내보낸 문서 수를 확인하는 빠른 방법입니다.
wc -l ~/project/*.json ~/project/*.csv
각 문서가 한 줄에 있는 JSON 파일의 경우 줄 수는 문서 수와 같습니다. CSV 파일의 경우 줄 수는 헤더를 포함한 데이터 행 수입니다.
2 /home/labex/project/active_users.json
3 /home/labex/project/users.json
27 /home/labex/project/users_pretty.json
4 /home/labex/project/users.csv
3 /home/labex/project/users_limited.csv
39 total
마지막으로 JSON 파일의 구문을 확인할 수 있습니다. mongoexport는 기본적으로 각 문서가 자체 줄에 별도의 JSON 객체인 JSONL(JSON Lines) 형식을 생성합니다. 이 형식을 확인하려면 각 줄을 개별적으로 확인할 수 있습니다.
while IFS= read -r line; do
echo "$line" | python3 -m json.tool > /dev/null
done < ~/project/users.json && echo "All JSON lines are valid"
명령이 오류 없이 실행되면 JSON 파일이 유효한 것입니다. 이러한 확인 기술은 데이터 내보내기가 완전하고 정확한지 확인하는 데 도움이 됩니다.
요약
이 실습에서는 mongoexport 유틸리티의 필수 기능을 배웠습니다. 샘플 데이터셋을 생성하고 기본적인 JSON 파일 내보내기를 수행하는 것으로 시작했습니다. 그런 다음 동일한 데이터를 CSV 파일로 내보내면서 테이블 형식에 필요한 필드를 지정하는 방법 (--fields) 을 배웠습니다. 또한 --query 옵션을 사용하여 데이터를 필터링하고 특정 하위 집합의 문서만 내보내는 연습을 했습니다. 마지막으로 사람이 읽을 수 있는 JSON 을 위한 --pretty와 내보낼 레코드 수를 제어하기 위한 --limit과 같은 형식 지정 옵션을 살펴보았습니다. 이러한 연습을 통해 다양한 목적으로 MongoDB 에서 데이터를 추출하는 실용적인 기술을 습득했습니다.

