mongodb中是可以保存二进制文件的,其用于存储文件的文件系统叫做gridfs,有点类似hadoop的HDFS的感觉。
gridfs的入门操作,如保存、查看、删除,还是比较简单的,也不需要复杂的配置,只要mongodb安装好就ok,我的mongodb已经安装好,使用默认的配置。
XXXXX@XXXXX-asus:~$ ls -al mongodb_log_bak.log -rw-r--r-- 1 XXXXX XXXXX 122106 3月 21 14:18 mongodb_log_bak.log XXXXX@XXXXX-asus:~$ mongofiles --host localhost --port 27017 list connected to: localhost:27017 XXXXX@XXXXX-asus:~$ mongofiles --host localhost --port 27017 put mongodb_log_bak.log connected to: localhost:27017 added file: { _id: ObjectId('532bde4f11647a7d20f88825'), filename: "mongodb_log_bak.log", chunkSize: 262144, uploadDate: new Date(1395383887367), md5: "37563b840ee4b7fe92d3a6051aac4665", length: 122106 } done! XXXXX@XXXXX-asus:~$ mongofiles --host localhost --port 27017 list connected to: localhost:27017 mongodb_log_bak.log 122106 XXXXX@XXXXX-asus:~$ rm mongodb_log_bak.log XXXXX@XXXXX-asus:~$ mongofiles --host localhost --port 27017 get mongodb_log_bak.log connected to: localhost:27017 done write to: mongodb_log_bak.log XXXXX@XXXXX-asus:~$ ls -al mongodb_log_bak.log -rw-rw-r-- 1 XXXXX XXXXX 122106 3月 21 14:42 mongodb_log_bak.log XXXXX@XXXXX-asus:~$ mongofiles --host localhost --port 27017 delete mongodb_log_bak.log connected to: localhost:27017 done! XXXXX@XXXXX-asus:~$
在这个例子中,我将之前的mongodb的log备份出来,mongodb_log_bak.log,用于测试。保存、查询、获取、删除分别是put、list、get、delete,更多的选项也可以用mongofiles --help来看。gridfs也有一些不足的地方,比如,保存文件的时候没有保存时间戳,只保存了文件内容。
也可以登陆mongodb的client看fs.chunks和fs.files。
XXXXX@XXXXX-asus:~$ mongo MongoDB shell version: 2.2.4 connecting to: test > show collections emp_dept fs.chunks fs.files master_slave result system.indexes testrep > db.fs.chunks.find({},{"_id":1,"n":1,"files_id":1}) { "_id" : ObjectId("532bde4fb65a5f88fa9c1649"), "files_id" : ObjectId("532bde4f11647a7d20f88825"), "n" : 0 } > db.fs.files.find() { "_id" : ObjectId("532bde4f11647a7d20f88825"), "filename" : "mongodb_log_bak.log", "chunkSize" : 262144, "uploadDate" : ISODate("2014-03-21T06:38:07.367Z"), "md5" : "37563b840ee4b7fe92d3a6051aac4665", "length" : 122106 } >
fs.chunks实际上还有一个元素“data”,看名字就知道这个是保存文件的具体内容,由于文件比较大,我就没有列出来,文件的大部分信息在fs.files中有列出,与之前使用mongofiles时候的提示信息一致。其实,把文件存入到GridFS过程中,如果文件大于chunksize,gridfs会把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。我的这个实验中,数据文件似乎还是小了一点,只有1个chunk。
于是加大文件,使用cat mongodb_log_bak.log >> 1.txt,执行3次,得到一个源文件3倍大小的文件,这次应该会出现2个chunk,重复上述步骤,发现的确如此
XXXXX@XXXXX-asus:~$ mongo MongoDB shell version: 2.2.4 connecting to: test > db.fs.chunks.find({},{"_id":1,"n":1,"files_id":1}) { "_id" : ObjectId("532be575b65a5f88fa9c164b"), "files_id" : ObjectId("532be575c305f3ace8c29bc1"), "n" : 0 } { "_id" : ObjectId("532be576b65a5f88fa9c164c"), "files_id" : ObjectId("532be575c305f3ace8c29bc1"), "n" : 1 } > db.fs.files.find() { "_id" : ObjectId("532be575c305f3ace8c29bc1"), "filename" : "1.txt", "chunkSize" : 262144, "uploadDate" : ISODate("2014-03-21T07:08:38.016Z"), "md5" : "518bd138bd4fd009b96181b207217d04", "length" : 366318 } >