2017-01-12 4 views
1

하나의 csv/excel 파일에 Mongo 데이터베이스의 데이터를 덤프하고 싶습니다. 데이터베이스에 동일한 필드와 포함 된 필드가있는 여러 문서가 있습니다. 각 임베디드 필드를 내 CSV 파일의 한 열로, 각 문서를 한 줄로하고 싶습니다. 가 여기에 목표 : 발견의 필터 인수로하나의 csv 파일에 Mongo 데이터베이스 덤프

a_cursor = a_collection.find(filter, projection) # pymongo.collection.find() method 
a_csv_file = print_cursor_to_csv(a_cursor,projection) # the method I would like to create 
  • (), 나는 몽고 문서를 필터링 할 수 있습니다.
  • find()의 projection 인수를 사용하여 csv 열에 입력 할 필드를 선택합니다.
  • print_cursor_to_csv()에서 projection 인수가 다시 사용됩니다. 이번에는 csv 파일의 필드/열 순서를 지정하기 위해. 실제로 프로젝션은 필드 목록이며 첫 번째 필드는 첫 번째 CSV 열입니다. 여기

내가 쓴 방법 :

def _print_cursor_in_csv(cursor, fields_to_show_order): 
    """ 

    :param cursor: pymongo.Cursor. The list of documents to print into csv. 
    :param fields_to_show_order: List of String. Permits to know the order of columns chosen by the user. 
      Example : BaseStation_ID as first columns, then frequency of utilisation etc.. 
    """ 
    flattened_cursor = [] 
    for a_document in cursor: 
     flattened_cursor.append(_flatten_the_dict(a_document)) 
    string_csv = _get_string_csv_from_list_of_dicts(flattened_cursor, fields_to_show_order) 
    _write_a_file_from_a_string("testCSV"+".csv", string_csv) # PRINT CSV OF A DOC 

내 방법을 작동하지만 크고, 나는 그런 판다, openpyxl 또는 CSV로 파이썬 라이브러리에 더 의존하고 싶습니다. 아마도 그들 중 하나가 사전을 목록 화 한 후 각 파일을 병합 한 후 csv 파일을 작성할 수 있습니다.

당신은이 작업을 수행 할 mongoexport을 사용할 수 있습니다

마티아스

답변

0

, 당신의 도움을 주셔서 감사합니다. 다음은 수집 트래픽의 모든 데이터 형식 데이터베이스 테스트를 csv 파일로 덤프하는 예제입니다. (버전 3.0을 시작. --csv 옵션 plase 사용 제거 몽고 --type = CSV) 당신이 덤프 할 데이터를 쿼리하여이 작업을 수행 할 수있는 레코드의 수를 축소하려는 경우

mongoexport --db test --collection traffic --type=csv --out traffic.csv 

. 그냥 -q 예에 쿼리를 추가

--query '{"field": 1}' 

을 경우 당신은 단지 당신이 (당신은 필드 목록을 제공해야 CSV로) 다음과 같은 옵션을 추가 할 수 있습니다 수출 될 몇 가지 필드 (들)을 원하는 :

--fields <field1,field2> 

쉼표 뒤에 공백이 없는지 확인하십시오. 공백이있는 입력란은 앞이나 뒤에 공백없이 쉼표로 구분되지만 전체 목록을 따옴표로 묶어야합니다 (문서는 약간 분명하지 않습니다).

당신이로를 해결할 수 내장되는 특수 필드 얻고 싶은 경우에 :

--fields "field1,toplevelFieldName.0.field2" 

요소의 인덱스로 "0"이 있음을 양해 바랍니다. monogexport는 모든 요소를 ​​csv의 맨 위로 내보낼 수 없으므로 하나씩 주소를 지정해야하므로 비현실적입니다. 또는 $unwind을 사용하여 추가 콜렉션에 데이터를 저장 한 다음 내보낼 수 있습니다. 경우에

또는 당신은 당신이 사용할 수있는 완전한 임베디드 문서를 얻을 괜찮다 :

-- fields "field1,toplevelFieldName" 

toplevelFieldName가 포함 된 문서의 이름입니다.

mongoexport에 대한 전체 설명서는 here입니다.

+0

감사합니다. 실제로 훨씬 쉽습니다. mongoexport --authenticationMechanism SCRAM-SHA-1로 인증을 시도하는 중에 '2017-01-13T09 : 25 : 27.625 + 0100 사용자 어설 션 : 2 : SCRAM-SHA-1'오류가 발생합니다. 메커니즘 지원은 클라이언트 라이브러리에 컴파일되지 않았습니다.'mongoexport 2.6.10이 있습니다. 두 번째 질문 : 데이터베이스에서 사전의 목록 인 일부 필드가 있고, 각 사전에는 동일한 두 필드 x와 y가 있습니다. 각 셀의 관련 셀에서 열 머리글과 y 값에 x 값을 가져 오기 위해 이러한 데이터를 내보내 려합니다. 다시 한 번 감사드립니다 – Matias

+0

버전 3.0 이후로 MongoDB는 더 이상 MONGODB-CR로 기본 설정되지 않고 SCAM-SHA-1을 기본 인증 메커니즘으로 사용합니다. 이전 버전에서는'--authenticationMechanism MONGODB-CR'을 사용할 수 있습니다. – MBushveld