MongoDB 셸 출력을 파일로 '예쁘게'인쇄하는 방법이 있습니까?


101

특히 mongodb의 결과를 find()파일 로 인쇄하고 싶습니다 . JSON 개체가 너무 커서 셸 창 크기로 전체 개체를 볼 수 없습니다.

답변:


216

쉘은 대화 형 환경이기 때문에 멋지지만 숨겨진 기능을 제공합니다.

mongo commands.js를 통해 자바 스크립트 파일에서 명령을 실행할 때 완전히 동일한 동작을 얻지 못할 것입니다.

이 문제에는 두 가지 방법이 있습니다.

(1) 셸을 가짜로 만들고 대화 형 모드라고 생각하게 만듭니다.

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

또는
(2) Javascript를 사용하여 결과를 find()인쇄 가능한 JSON으로 변환

mongo dbname command.js > output.json

여기서 command.js에는 다음이 포함됩니다 (또는 이에 상응하는 항목) :

printjson( db.collection.find().toArray() )

이것은 [ ]배열과 printjson()각 요소를 반복 할 수있는 것을 원하지 않는 경우를 포함하여 결과 배열을 예쁘게 인쇄합니다 .

그건 그렇고, 하나의 Javascript 문만 실행하는 경우 파일에 넣을 필요가 없으며 대신 다음을 사용할 수 있습니다.

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

command.js는 현재 디렉토리에 있고 실행할 자바 스크립트가있는 읽을 수있는 파일이어야합니다.
Asya Kamsky

원격 mongo db는 어떻게합니까? 나는 시도 mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt했지만 나에게 주었다 JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
Sheharyar

이 오류는 --eval 뒤에 따옴표 안에있는 내용이 합법적 인 구문이 아님을 의미합니다. 전체 표현식 외부에 작은 따옴표를 사용하는 것이 좋으며 내부에 따옴표가 필요한 경우 큰 따옴표를 사용하십시오.
Asya Kamsky 2014 년

2
옵션 2는 결과가 몇 개 이상인 경우 실제로 유일한 옵션입니다. 옵션 1에서는 '추가를 위해 "it"입력'에서 멈출 것이기 때문입니다.
Tomty

2
실제로 @Tomty가 아닙니다-쉘 배치의 크기는 쉘 내부의 변수로 제어 할 수 있습니다. 당신은 당신의 .mongodbrc.js 파일에 DBQuery.shellBatchSize = 10000을 넣을 수 있습니다 그것을 것입니다 만 개 결과 대신 20 후 "정지"
하기 Asya Kamsky

29

터미널에서이 작업을 수행하고 정상적인 방식으로 레코드를 검사하기를 원하므로 다음과 같은 트릭을 사용할 수 있습니다.

mongo | tee somefile

세션을 정상적으로 사용 db.collection.find().pretty()하거나 필요한 작업을 수행하고 긴 출력을 무시하고 종료하십시오. 세션 기록은 작성된 파일 tee에 있습니다.

mongo 셸이 대화 형 세션을 예상하기 때문에 출력에 이스케이프 시퀀스 및 기타 쓰레기가 포함될 수 있습니다. less우아하게 처리합니다.


12

실행하려는 명령을 파일에 넣은 다음 데이터베이스 이름과 함께 셸에 전달하고 출력을 파일로 리디렉션하십시오. 따라서 find 명령이에 find.js있고 데이터베이스가 foo인 경우 다음과 같습니다.

./mongo foo find.js >> out.json

이것은 나를 위해 작동하지 않았으며 셸 버전과 db 이름 만 out.json. mongo foo < find.js > out.json일했다.
James Brown

1
이 답변은 도구가 Go 및 여러 버전에서 다시 작성되기 전에 작성되었습니다. 아주 오래된 것을 사용하지 않는 한, 아마도 그것이 당신을 위해 작동하지 않는 이유 일 것입니다
Adam Comerford

10

쿼리 (예 db.someCollection.find().pretty():)를 javascript 파일에 넣습니다 query.js. 그런 다음 다음 명령을 사용하여 운영 체제의 셸에서 실행합니다.

mongo yourDb < query.js > outputFile

쿼리 결과는 'outputFile'이라는 파일에 있습니다.

기본적으로 Mongo는 처음 20 개의 문서 IIRC를 인쇄합니다. 더 많은 것을 원한다면 Mongo 셸에서 배치 크기에 새 값을 정의 할 수 있습니다.

DBQuery.shellBatchSize = 100.


이. .js연장 으로 오해하지 마십시오 . 전혀 변경하지 않고 모든 멋진 mongo 쉘 쿼리를 작성할 수 있습니다.
AD

4

사용 print하고 JSON.stringify당신은 간단하게 생성 할 수 있습니다 유효한 JSON 결과를. 플래그를
사용 --quiet하여 출력에서 ​​쉘 노이즈를 필터링합니다. 평가 를 피하기 위해 플래그를
사용하십시오 . (내가 사용하는 예쁜 포맷터 때문에 잘못된 JSON 출력 이 생성되기 때문에해야했습니다 .) 페이징을 피하기 위해 실제 결과의 한계로 바꾸는 것을 사용하십시오 .--norc.mongorc.jsDBQuery.shellBatchSize = ??

마지막으로 tee터미널 출력을 파일로 파이프하는 데 사용 합니다.

// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json

// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
  print(JSON.stringify(data, null, 2));
}

toPrint(
  db.getCollection('myCollection').find().toArray()
);

도움이 되었기를 바랍니다!


2

Asya Kamsky 의이 답변 을 사용하여 Windows 용 한 줄 박쥐 스크립트를 작성했습니다. 라인은 다음과 같습니다.

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

그런 다음 실행할 수 있습니다.

exportToJson.bat DbName CollectionName


2

writeFile () 함수로 결과를 저장했습니다 .

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Mongo 셸 버전은 4.0.9였습니다.


1

또한 mongoexport가 있습니다 가 있지만 어떤 버전을 사용할 수 있는지 확실하지 않습니다.

예:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

으로 대답 Neodan의 mongoexport에 의해 꽤 유용 -q쿼리에 대한 옵션을 선택합니다. 또한 ObjectId표준 형식의 JSON으로 변환 됩니다 "$oid". 예 :

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

이 명령을 사용하여 얻을 수 있습니다.

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.