mongodb中是能夠保存二進制文件的,其用於存儲文件的文件系統叫作gridfs,有點相似hadoop的HDFS的感受。mongodb
gridfs的入門操做,如保存、查看、刪除,仍是比較簡單的,也不須要複雜的配置,只要mongodb安裝好就ok,個人mongodb已經安裝好,使用默認的配置。shell
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也有一些不足的地方,好比,保存文件的時候沒有保存時間戳,只保存了文件內容。oop
也能夠登錄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。spa
因而加大文件,使用cat mongodb_log_bak.log >> 1.txt,執行3次,獲得一個源文件3倍大小的文件,此次應該會出現2個chunk,重複上述步驟,發現的確如此code
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 } >