mongodb的gridfs

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 }
> 

 

posted @ 2014-03-21 15:05  valleylord  阅读(631)  评论(0编辑  收藏  举报