mongo 쿼리의 출력을 csv 파일로 리디렉션


85

32 비트 Windows7 컴퓨터에 MongoDB 2.2.2를 사용하고 있습니다. .js 파일에 복잡한 집계 쿼리가 있습니다. 이 파일을 셸에서 실행하고 출력을 CSV 파일로 보내야합니다. 쿼리가 "플랫"json (중첩 키 없음)을 반환하므로 본질적으로 깔끔한 csv로 변환 할 수 있습니다. 및

에 대해 알고 있습니다. 전체 쿼리를 셸에 붙여넣고 스크립트 내부 에서만 허용 하지만 csv가 필요합니다. 그리고 두 번째 방법 : .. 화면에 출력을 인쇄하고 다시 json 형식으로 인쇄합니다. Mongo가 json에서 csv로 변환하는 방법이 있습니까? (데이터 차트를 준비하려면 csv 파일이 필요합니다). 나는 다음과 같이 생각하고있다. 1. 어느 mongo는 내가 지금 찾을 수없는 내장 명령을 가지고있다.load()eval()eval()printjson()load()




2. Mongo는 나를 위해 그것을 할 수 없습니다. 기껏해야 json 출력을 파일로 보낼 수 있으며이 파일을 직접 csv로 변환해야합니다.
3. Mongo는 json 출력을 임시 컬렉션으로 보낼 수 있으며, 그 내용은 쉽게 mongoexportedcsv 형식으로 될 수 있습니다 . 하지만지도 축소 쿼리 만 출력 컬렉션을 지원한다고 생각합니다. 맞습니까? 집계 쿼리에 필요합니다.

도움을 주셔서 감사합니다 :)


1
이것이 자주하는 일이라면 .NET, python을 사용하여 독립 실행 형 EXE를 작성하거나 NodeJ를 사용할 수 있습니다. 각각에는 코드를 쉽게 실행하고 원하는 출력을 생성 할 수있는 네이티브 드라이버가 있습니다.
WiredPrairie

stackoverflow.com/questions/4130849/… 에서 Zachary의 답변을 참조하고 있으며 json에서 csv로 변환 할 수 있습니다. 그러나 대안으로 json을 컬렉션으로 출력 한 다음 mongoexport를 수행 할 수 있습니까?
Aafreen Sheikh 2013-01-23

NodeJS 용 Node와 MongoDB 드라이버를 사용하여 작은 하네스를 구축 한 다음 원하는 코드를 실행할 수 있습니다. 셸 없이도 원하는 결과를 매우 빠르게 얻을 수 있습니다. 매우 유지 관리 및 디버깅이 가능합니다.
WiredPrairie

답변:


175

나는이 질문이 오래되었다는 것을 알고 있지만 복잡한 쿼리를 csv로 내보내려고 한 시간을 보내고 내 생각을 공유하고 싶었습니다. 처음에는 csv 변환기에 대한 json을 사용할 수 없었습니다 ( 이것이 유망 해 보였지만). 내가 한 일은 mongo 스크립트에 csv 파일을 수동으로 작성하는 것이 었습니다.

이것은 간단한 버전이지만 본질적으로 내가 한 일입니다.

print("name,id,email");
db.User.find().forEach(function(user){
  print(user.name+","+user._id.valueOf()+","+user.email);
});

이것은 방금 쿼리를 stdout으로 파이프했습니다.

mongo test export.js > out.csv

test내가 사용하는 데이터베이스의 이름은 어디에 있습니까 ?


사용자 컬렉션이있는 DB를 어떻게 지정합니까?
Nelu

2
@NeluMalancea 는이 정보가 있는 MongoDB 문서 를 확인 하십시오. use <database>스크립트 맨 위에 추가하여 DB를 지정할 수 있습니다
GEverding

2
실제로 "use <database>"와 같은 셸 도우미는 자바 스크립트가 아니기 때문에 허용되지 않습니다. docs.mongodb.org/manual/tutorial/…을 참조하십시오 . 대신 다음과 같이 스크립트를 시작하십시오. conn = new Mongo (); db = conn.getDB ( 'your_db_name');
Steve Hansen Smythe

2
몽고 명령은 DB URL을 받아 @NeluMalancea (사용자, 패스, ...)
iwein

3
@NeluMalancea test마지막 명령이 데이터베이스의 이름, 당신의 데이터베이스의 이름으로 대체합니다.
Zoltán

112

Mongo의 내장 내보내기는 형식 날짜, 은밀한 데이터 유형 등과 같은 데이터 조작을 원하지 않는 한 잘 작동합니다.

다음 명령은 매력으로 작동합니다.

    mongoexport -h localhost -d databse -c collection --type=csv 
    --fields erpNum,orderId,time,status 
    -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
    --out report.csv

17
엄청 고마워! 힌트 : 지금은 --type=csv대신 --csv.
1

mongoexport의 한계는 필드를 조작 할 수 없다는 것입니다. 몽고 ID는 ObjectId (mongidstring)로 내 보냅니다. 누군가 필드의 데이터를 조작하려는 경우 mongo 쉘 스크립트에서 결과를 내보낼 수있는 것이 좋습니다 (예 : ObjectId (mongidstring) .toString ()).
Raj006

집계 작업을 수행 할 수 있습니까?
Hendy Irawan 19

이 솔루션은 효과가있었습니다. 그러나 Windows의 경우 두 가지 수정을해야했습니다. 외부에서 이중 아포스트로피가 필요하고 -q "{name : 'stackoverflow'}"와 같이 내부에 단일 아포스트로피가 필요했습니다. 포트 지정 -p 명령도 작동하지 않았습니다. -port 27000.
nurb

10

다른 답변 확장 :

@GEverding의 대답이 가장 유연하다는 것을 알았습니다. 집계에서도 작동합니다.

test_db.js

print("name,email");

db.users.aggregate([
    { $match: {} }
]).forEach(function(user) {
        print(user.name+","+user.email);
    }
});

결과를 내보내려면 다음 명령을 실행하십시오.

mongo test_db < ./test_db.js >> ./test_db.csv

불행히도 CSV 파일에 추가 텍스트를 추가하여 사용하기 전에 파일을 처리해야합니다.

MongoDB shell version: 3.2.10 
connecting to: test_db

하지만 mongo 쉘이 이러한 주석을 뱉어내는 것을 중지하고 --quiet플래그 를 전달하여 요청한 내용 만 인쇄하도록 할 수 있습니다.

mongo --quiet test_db < ./test_db.js >> ./test_db.csv

1
그의 대답을 편집하는 것이 새 대답을 추가하는 것보다 낫습니다.
Renato Back

6

시도 할 수있는 작업은 다음과 같습니다.

print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
    jsonObject = cursor.next();
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")

}

파일에 저장하고 "export.js"라고 말합니다. 다음 명령을 실행하십시오.

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv

5

이것 좀 봐

mongo 쉘에서 파일로 출력하기 위해. mongos 셸에서 csv 출력을 지원하지 않습니다. 자바 스크립트를 직접 작성하거나 사용 가능한 많은 변환기 중 하나를 사용해야합니다. 예를 들어 Google은 "json을 csv로 변환"합니다.


0

제가 사용해 왔던 멋진 솔루션으로 여기 무게를 재는 것뿐입니다. 이는 집계를 지원하지만 필드 이름을 하드 코딩 할 필요가 없다는 점에서 위 의 Lucky Soni 솔루션 과 유사 합니다.

cursor = db.<collection_name>.<my_query_with_aggregation>;

headerPrinted = false;
while (cursor.hasNext()) {
    item = cursor.next();
    
    if (!headerPrinted) {
        print(Object.keys(item).join(','));
        headerPrinted = true;
    }

    line = Object
        .keys(item)
        .map(function(prop) {
            return '"' + item[prop] + '"';
        })
        .join(',');
    print(line);
}

.js파일을 파일 로 저장하세요 .이 경우 에는 파일을 호출 example.js하고 다음과 같이 mongo 명령 줄로 실행합니다.

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