GridFSの概要
MongoDBに保存できるドキュメントのサイズは、
今回はMongoDBでサイズの大きなファイルを扱う仕組みである、
![図1 GridFSの概要図 図1 GridFSの概要図](/assets/images/dev/serial/01/mongodb/0007/thumb/TH800_001.jpg)
ファイルをデータベースで管理するメリット
ところで、
多くのシステムでは、
メタデータの管理がしやすい
ファイルだけではなく、
ファイルシステムの作成数制限を受けない
OS全体でファイル数やディレクトリ数の作成数には制限があります。たとえば、
簡単にGridFSを使ってみる
MongoDBでGridFSを使うのに特別な設定・
今回は、 まず、 mongofiles 上記のように表示されますと保存成功です。 Mongo ShellからGridFSのコレクションを確認してみましょう。MongoDBに接続し、 インデックスの他に、 GridFSでは、 fs. 保存されているメタデータに関しては公式ドキュメントにより詳しい情報があります。 次のページでは、 mongofilesはMongoDBに標準で用意されているコマンドラインツールです。MongoDBをインストールしたディレクトリのbin以下にあります。このmongofilesを使って、 ファイルの追加にはputを使います。ここではgridtestデータベースに1MB. 同じファイル名で追加しても、 ファイルの取得にはgetを使います。 同じファイル名があった場合は、 ファイルをリスト表示するにはlistを使います。ファイル名とファイルサイズが表示されます。同じファイル名がある場合は、 ファイルの削除にはdeleteを使います。 ファイルの検索にはsearchを使います。指定した文字列がファイル名に含まれている場合は表示されます。 Ruby用のMongoDB公式ドライバを使用することにより、 必須ではありませんが、 まずは準備を行います。RubyからGridFSを扱うには、 以下はgridtestデータベースに対して1MB. 上記をgrid_ mongofiles、 今回はMongoDBでサイズの大きなファイルを扱うGridFSを紹介いたしました。GridFSを使うことにより、 次回はリリース間近となっているMongoDB v2.$ dd if=/dev/zero of=1MB.file bs=1M count=1
$ 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
> use gridtest
> show collections
fs.chunks
fs.files
system.indexes
mongofilesを使ったGridFSの操作
各コマンド共通のコマンドラインオプション
-vオプションは詳細を出力します。ファイルの追加
$ mongofiles -v -d gridtest put 1MB.file
$ mongofiles -v -d gridtest -r put 1MB.
ファイルの取得
$ mongofiles -v -d gridtest get 1MB.file
ファイルのリスト表示
$ 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
ファイルの削除
[注意]
同じファイル名のデータはすべて削除されるので注意してください。$ mongofiles -v -d gridtest delete 1MB.file
ファイルの検索
$ mongofiles -v -d gridtest search 1MB
Rubyを使ったGridFSの操作
$ gem install mongo
$ gem install bson_ext
$ dd if=/dev/zero of=1MB.file bs=1M count=1
$ mongofiles -d gridtest put 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)
$ 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
その他のツール
次回のテーマ