2013-09-27 65 views
1

我需要將某些表從MySQL遷移到mongoDB。搜索完網頁後,對我來說,它看起來像是一個MySQL導出到CSV,並且從CSV導入到mongoDB應該是最快和最簡單的方法。從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以字符串形式導入\\N而不是NULL值。

mongoDB導入選項--ignoreBlanks將不起作用,因爲mongoDB的觀點,\\N不是「空白」。

所以我的問題:

1)我怎麼能避免出口NULL\\N

2)如何mongodbimport讀/解釋\\N作爲NULL或空值?

順便說一句:這不是進行後處理CSV文件中搜索並替換\\N

論1.可能的答案)可能是select語句的修改選項:SELECT IFNULL(field1, "")但在這種情況下,我不得不定義並檢查每一列。如果所有列都在select語句中定義,則導出腳本不會如此靈活。

//編輯:同時與進口玩弄< - >出口我發現另一個問題:日期字段,這也解釋爲字符串從mongoimport

+0

* 「順便說一句:這不是進行後處理CSV文件中搜索並替換\\爲N的選項」 * - >爲什麼? – Philipp

+0

我認爲,如果你使用'sed','awk'或者帶有正則表達式的php腳本來處理大量帶有「未知」文本的大文本文件,那麼它就不那麼容易出錯或者不健壯。 –

+0

如果你只是這樣做一次,採取最簡單的方法,並按建議手動修復數據。如果這是一件常規的事情,那麼將整個過程自動化。 Mongoimport有限。你可以導出爲Json嗎? – WiredPrairie

回答

0

我會發表評論,而不是增加一個答案,但我的名譽仍然相當低...

我在一個項目中所做的工作是使用Python腳本進行遷移。我有一個CSV導出表。我使用的代碼如下所示:

import csv 
import zip 
import pymongo 

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

destinationItems = [] 

下讀取列名(以CSV第一行)

columns = next(reader) 

列可以放在這裏我所說的「鑰匙」的元組。代碼在這裏忘記了列名。每一行然後被轉換成一個字典,準備修改以刪除(或者用 - )做NULLs。

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) 

更新的MongoDB實例

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