我需要将一些表从MySQL迁移到mongoDB。在搜索网页后,对我而言,它看起来像MySQL导出为CSV,从CSV导入到mongoDB应该是最快最简单的方法。
我使用该查询导出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 :(得分: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 )