MongoDBでゆるふわDB体験

第7回 GridFS─大容量のファイルをMongoDBに保存する仕組み

この記事を読むのに必要な時間:およそ 3 分

mongofilesを使ったGridFSの操作

mongofilesはMongoDBに標準で用意されているコマンドラインツールです。MongoDBをインストールしたディレクトリのbin以下にあります。このmongofilesを使って,GridFSを操作してみましょう。

各コマンド共通のコマンドラインオプション
-vオプションは詳細を出力します。
-dオプションでデータベース名を指定します。

ファイルの追加

ファイルの追加にはputを使います。ここではgridtestデータベースに1MB.fileというファイルを追加します。

$ mongofiles -v -d gridtest put 1MB.file

同じファイル名で追加しても,上書きされずに別オブジェクトとして追加されます。上書きする場合は,-rオプションを指定してください。

$ mongofiles -v -d gridtest -r put 1MB.file

ファイルの取得

ファイルの取得にはgetを使います。

$ mongofiles -v -d gridtest get 1MB.file

同じファイル名があった場合は,後から追加されたものが取得されます。

ファイルのリスト表示

ファイルをリスト表示するにはlistを使います。ファイル名とファイルサイズが表示されます。同じファイル名がある場合は,複数表示されます。下の例では,1MB.fileという名前のファイルを2つ登録しています。

$ mongofiles -v -d gridtest list
Wed Feb 20 16:08:01 creating new connection to:127.0.0.1:27017
Wed Feb 20 16:08:01 BackgroundJob starting: ConnectBG
Wed Feb 20 16:08:01 connected connection!
connected to: 127.0.0.1
1MB.file        1048576
1MB.file        1048576
image01.png     524288
image02.png     262144

ファイルの削除

ファイルの削除にはdeleteを使います。

[注意]
同じファイル名のデータはすべて削除されるので注意してください。
$ mongofiles -v -d gridtest delete 1MB.file

ファイルの検索

ファイルの検索にはsearchを使います。指定した文字列がファイル名に含まれている場合は表示されます。

$ mongofiles -v -d gridtest search 1MB

Rubyを使ったGridFSの操作

Ruby用のMongoDB公式ドライバを使用することにより,RubyからGridFSを操作できます。ドライバはgemからインストールできます。

$ gem install mongo

必須ではありませんが,同様にgemでbson_extをインストールするとBSONの処理が高速化されます。

$ gem install bson_ext

まずは準備を行います。RubyからGridFSを扱うには,fs.chunksにインデックスが作成されている必要があります。mongofilesでファイルを登録することで,自動的にインデックスが作成されます。

$ dd if=/dev/zero of=1MB.file bs=1M count=1
$ mongofiles -d gridtest put 1MB.file

以下はgridtestデータベースに対して1MB.fileを保存と取得をし,最後に削除するスクリプトです。ファイル追加時に任意のメタデータを登録できます。

require  'mongo'

db_name = "gridtest"
@con = Mongo::Connection.new
@db = @con[db_name]
@grid = Mongo::Grid.new(@db)
@collection = @db["fs.files"]

# 任意のメタデータを追加可能
file_id = @grid.put(File.binread("1MB.file"),
                    :filename => "1MB.file",
                    :tags => ["mongo","database","book"],
                    :memo => "sample file",
                    :owner => "mongonouchi")

puts "get file_id=#{file_id}"
puts "filename = #{@grid.get(file_id).filename}"
puts ""

@collection.find({:_id => BSON::ObjectId(file_id.to_s)}).each{ |doc|
  puts doc.inspect
}

puts ""
puts "delete file_id=#{file_id}"
@grid.delete(file_id)

上記をgrid_sample.rbとして保存し,実行します。以下は出力のサンプルです。見やすいように改行を入れています。出力されるfile_idは環境によって変わります。

$ ruby grid_sample.rb
get file_id=512ac8a2af1fe66a0e000001
filename = 1MB.file

{"_id"=>BSON::ObjectId('512ac8a2af1fe66a0e000001'), 
 "filename"=>"1MB.file", 
 "contentType"=>"binary/octet-stream", 
 "length"=>1048576, 
 "chunkSize"=>262144, 
 "uploadDate"=>2013-02-25 02:12:50 UTC, 
 "md5"=>"b6d81b360a5672d80c27430f39153e2c", 
 "tags"=>["mongo", "database", "book"], 
 "memo"=>"sample file", 
 "owner"=>"mongonouchi"
}

delete file_id=512ac8a2af1fe66a0e000001

その他のツール

mongofiles,公式ドライバの他にもGridFSを操作するツールは開発されています。詳細な解説は省略しますが,Nginxから直接GridFSを操作するnginx-gridfsがあります。

次回のテーマ

今回はMongoDBでサイズの大きなファイルを扱うGridFSを紹介いたしました。GridFSを使うことにより,画像や動画などのファイルサイズの大きなデータをMongoDBで管理することができます。

次回はリリース間近となっているMongoDB v2.4の新機能の紹介をする予定です。MongoDB v2.4には全文検索,GeoJSON対応,ハッシュドシャードキーなど先進的な機能が追加されています。お楽しみに!

著者プロフィール

藤崎祥見(ふじさきしょうけん)

野村総合研究所 OpenStandia所属。オープンソースのR&Dとセミナー講師を担当。

Debian,Ubuntu,Liferayのコミュニティで活動した後,MongoDBの翻訳に関わり,丸の内MongoDB勉強会を始める。

実家がお寺で,住職の資格を所持する坊主系エンジニア。

Twitter:@syokenz


渡部徹太郎(わたなべてつたろう)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIやサポートの業務に従事。

藤崎と共同で丸の内MongoDB勉強会を始める。

趣味は自宅サーバ。好きなものはLinuxとRuby。

Twitter:@fetarodc


林田敦(はやしだあつし)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIや製品開発業務に従事。

丸の内MongoDB勉強会では広報兼雑用係を務める。

趣味はレザークラフト,ダイビング,スキー,キャンプ,ジェットスキー,カメラ等々。作って滑って撮って潜れるエンジニア。

Facebook:Atsushi Hayashida