GridFSの概要
MongoDBに保存できるドキュメントのサイズは、
今回はMongoDBでサイズの大きなファイルを扱う仕組みである、

ファイルをデータベースで管理するメリット
ところで、
多くのシステムでは、
メタデータの管理がしやすい
ファイルだけではなく、
ファイルシステムの作成数制限を受けない
OS全体でファイル数やディレクトリ数の作成数には制限があります。たとえば、
簡単にGridFSを使ってみる
MongoDBでGridFSを使うのに特別な設定・
今回は、
まず、
$ dd if=/dev/zero of=1MB.file bs=1M count=1
mongofiles
$ mongofiles -v -d gridtest put 1MB.file Wed Feb 20 15:23:27 creating new connection to:127.0.0.1:27017 Wed Feb 20 15:23:27 BackgroundJob starting: ConnectBG Wed Feb 20 15:23:27 connected connection! connected to: 127.0.0.1 added file: { _id: ObjectId('51246bdfa3264162c8e99716'), filename: "1MB.file", chunkSize: 262144, uploadDate: new Date(1361341409698), md5: "b6d81b360a5672d80c27430f39153e2c", length: 1048576 } done!
上記のように表示されますと保存成功です。
コレクション構造について
Mongo ShellからGridFSのコレクションを確認してみましょう。MongoDBに接続し、
$ mongo > use gridtest
> show collections fs.chunks fs.files system.indexes
インデックスの他に、
- fs.
chunks GridFSでは、
ファイルをチャンクとして一定サイズに分割して、 fs. chunksコレクションに保存します。分割するファイルサイズはデフォルトでは256KBです。 - fs.
files fs.
filesコレクションには、 ファイル名、 アップロード日時、 MD5ハッシュ情報、 ファイルサイズなどのメタデータが保存されています。任意のメタデータを追加することも可能です。 保存されているメタデータに関しては公式ドキュメントにより詳しい情報があります。
次のページでは、
mongofilesを使ったGridFSの操作
mongofilesはMongoDBに標準で用意されているコマンドラインツールです。MongoDBをインストールしたディレクトリのbin以下にあります。このmongofilesを使って、
各コマンド共通のコマンドラインオプション
-vオプションは詳細を出力します。ファイルの追加
ファイルの追加にはputを使います。ここではgridtestデータベースに1MB.
$ mongofiles -v -d gridtest put 1MB.file
同じファイル名で追加しても、
$ mongofiles -v -d gridtest -r put 1MB.file
ファイルの取得
ファイルの取得にはgetを使います。
$ mongofiles -v -d gridtest get 1MB.file
同じファイル名があった場合は、
ファイルのリスト表示
ファイルをリスト表示するにはlistを使います。ファイル名とファイルサイズが表示されます。同じファイル名がある場合は、
$ 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公式ドライバを使用することにより、
$ gem install mongo
必須ではありませんが、
$ gem install bson_ext
まずは準備を行います。RubyからGridFSを扱うには、
$ dd if=/dev/zero of=1MB.file bs=1M count=1 $ mongofiles -d gridtest put 1MB.file
以下はgridtestデータベースに対して1MB.
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_
$ 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、
次回のテーマ
今回はMongoDBでサイズの大きなファイルを扱うGridFSを紹介いたしました。GridFSを使うことにより、
次回はリリース間近となっているMongoDB v2.