2

我需要将一些表从 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 导入\\Nas 字符串而不是NULL值。

mongoDB 导入选项--ignoreBlanks将不起作用,因为\\N从 mongoDB 的角度来看,它不是“空白”。

所以我的问题:

1.) 我怎样才能避免导出NULL\\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 回答