接上回《Rails3下使用MongoDB做为数据库并使用GridFS保存文件》,这次需要将MySQL表中的数据导入MongoDB中,并将其中一个字段的内容写入文件并将文件保存到GridFS中,使用Rake脚本来实现会方便很多,下面是一个简单的MySQL表的结构(数据库和表名都是demo):

| id  | filename    | content
| 1   | level1.txt  | eNqtk8tOwzAQRX/Fmj3NjB9pkOKu2

需要将表内容导入MongoDB的Blog表中,字段在导入时的对应关系:

demo.filename -> blog.name
demo.content -> blog.content

然后将demo.content字段内容保存成以demo.filename字段内容命令的文件中,文件保存在levels目录下,然后将文件写入GridFS中。 代码如下:

# 此脚本需要 mysql2 和 mongo 这两个Gems
require 'mongo'
include Mongo

namespace :movetomongo do
  task :move => :environment do
    # 指定要导入的MySQL的表名
    MYSQL_TABLE = "demo"
    # 文件保存路径
    PATCH_PATH = "levels/"
    # 连接MySQL
    mysql_client = Mysql2::Client.new(
      :host       => "localhost", 
      :username   => "root", 
      :password   => "123123",
      :database   => "demo"
    )
    results = mysql_client.query("select * from #{MYSQL_TABLE}")
    results.each do |row|
      insert_to_mongodb(row)
    end
  end
end

def insert_to_mongodb(row)
  file_path = PATCH_PATH + row["filename"]
  file = File.open(file_path, 'w')
  file.write(row["content"])
  doc = {
    "name" => row["filename"],
    "content" => row["content"],
    "file" => file
  }
  blog = Blog.create(doc)
  puts "#{blog.id} saved."
  file.close
end

最后在执行如下rake movetomongo:move导入,完成后文件会被直接保存到file_uploader设置的GridFS路径中。