通过从MySQL迁移到mongo的Null值

时间:2013-09-27 07:34:06

标签: mysql mongodb import migration export

我需要将一些表从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的字符串

1 个答案:

答案 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 )