2

いくつかのテーブルを MySQL から mongoDB に移行する必要があります。Web を検索した後、MySQL を CSV にエクスポートし、その CSV から mongoDB にインポートするのが最も速くて簡単な方法であるように思えます。

そのクエリを使用してMySQLをエクスポートしています:

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

しかし、問題が 1 つあります。

MySQL フィールドが の場合、NULLMySQL エクスポートは\N(または\\N) を CSV ファイルに書き込みます。そのファイルをインポートすることにより、mongoDB\\Nは値ではなく as 文字列をインポートしNULLます。

mongoDB の観点では「空白」ではない--ignoreBlanksため、mongoDB インポート オプションは機能しません。\\N

だから私の質問:

NULL1.)としてエクスポートしないようにするにはどうすればよい\\Nですか?

また

2.) どのように、または空の値としてmongodbimport読み取り/解釈 できますか?\\NNULL

ところで、CSV を後処理して検索して置き換えるオプションはありません。\\N

1.) の可能な答えは、select ステートメントの変更である可能性があります。SELECT IFNULL( field1, "" )ただし、この場合、すべての列を定義してチェックする必要があります。すべての列が select ステートメントで定義されている場合、エクスポート スクリプトはそれほど柔軟ではありません。

//編集: その import<->export をいじっているときに、別の問題を見つけました: 日付フィールドも mongoimport からの文字列として解釈されます

4

1 に答える 1

0

回答を追加するのではなくコメントしますが、私の評判はまだかなり低いです...

私が取り組んでいるプロジェクトで行ったことは、Python スクリプトを使用して移行を行うことです。エクスポートされたテーブルを CSV に持っています。私が使用するコードは次のようになります。

import csv
import zip
import pymongo

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

destinationItems = []

以下は、列名を読み取ります (CSV の最初の行)

columns = next( reader )

列は、ここで「キー」と呼ぶタプルに入れることができます。ここのコードは、列名を無視しています。次に、各行は辞書に変換され、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 )

mongodb インスタンスを更新する

mongoClient = pymongo.MongoClient()
mongoClient['mydb'].mycollection.insert( destinationItems )
于 2013-10-23T15:37:11.907 に答える