2013-09-27 2 views
1

MySQL에서 mongoDB로 일부 테이블을 마이그레이션해야합니다. 웹 검색 후 CSV에 대한 MySQL 내보내기와 같으며 mongoDB에 대한 CSV에서 가져 오는 것이 가장 빠르고 쉬운 방법입니다.Null MySQL에서 mongo 로의 이전 값

는 그 쿼리를 사용하여 수출 MySQL을 해요 :

select * into outfile '/tmp/feed.csv' 
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
      LINES TERMINATED BY '' 
    from feeds; 

를하지만 한 가지 문제가있다.

MySQL 필드가 NULL이면 MySQL 내보내기는 \N (또는 \\N)을 CSV 파일에 기록합니다. 해당 파일을 가져 와서 mongoDB는 \\NNULL 값 대신 문자열로 가져옵니다.

mongoDB의 관점에서 \\N이 "비어 있지"않기 때문에 mongoDB 가져 오기 옵션 --ignoreBlanks이 작동하지 않습니다.

그래서 내 질문 :

1) 나는 \\NNULL 수출을 피할 수있는 방법?

또는

2) 방법 mongodbimport 읽기/NULL 또는 빈 값으로 \\N을 해석 할 수 있을까? 그런데

: 그것은 선택 성명의 변경 될 수 있음) 검색 1. 가능한 대답에 \\N

을 대체 할 CSV를 사후 처리 할 수있는 옵션이 아니다 : SELECT IFNULL(field1, "") 그러나이 경우 나는에있다 각 열을 정의하고 확인하십시오. select 문에 모든 열이 정의되어 있으면 내보내기 스크립트가 그다지 유연하지 않습니다.

// 편집 : 그 수입으로 주위 < 재생하는 동안 - 내가 다른 문제가 발견> 수출 : 또한 mongoimport에서 문자열로 해석 날짜 필드는

+0

* * -> 왜가? – Philipp

+0

"sed", "awk"또는 정규식을 사용하는 PHP 스크립트를 사용하여 "알 수없는"텍스트가 많은 큰 텍스트 파일을 프로세스에 게시하면 오류가 발생하기 쉽거나 강력하지 않습니다. –

+0

이 작업을 한 번 수행하는 경우 가장 간단한 방법을 사용하고 제안 된대로 수동으로 데이터를 수정하십시오. 일상적인 것이라면 전체 프로세스를 자동화하십시오. 몽고 짐은 제한되어 있습니다. Json으로 내보낼 수 있습니까? – WiredPrairie

답변

0

나는 코멘트가 아닌 대답을 추가,하지만 내 명성을 것입니다 여전히 매우 낮습니다 ...

내가하고있는 프로젝트에서 수행 한 작업은 Python 스크립트를 사용하여 마이그레이션하는 것입니다. CSV에 내 보낸 테이블이 있습니다. 내가 사용하는 코드는 다음과 같습니다

import csv 
import zip 
import pymongo 

f = open(filename) 
reader = csv.reader(f) 

destinationItems = [] 

다음은

columns = next(reader) 

열이 나는 여기가 '키'를 부르는 튜플에 넣어 될 수있다 (첫번째 CSV에서 행) 열 이름을 읽습니다. 여기서 코드는 열 이름을 알지 못합니다. 각 행은 NULL을 제거하기 위해 수정할 준비가 된 사전으로 변환됩니다.

keys = tuple(columns) 

for property in reader: 
    entry = dict(zip(keys, property)) 

및 다음은 NULL을 처리합니다. 이 경우에는 내 보낸 CSV에서 'NULL'인 항목을 모두 제거합니다.

entry = { k:v for k,v in entry.iteritems() if (k in keys and (v != 'NULL') or k not in keys) } 

    destinationItems.append(entry) 

업데이트 "그런데 : 그것은 \\ N 검색하고 대체 할 CSV를 사후 처리 할 수있는 옵션이 아니다"는 MongoDB의 인스턴스

mongoClient = pymongo.MongoClient() 
mongoClient['mydb'].mycollection.insert(destinationItems)