MongoDB 教程
1. MongoDB 教程 2. NoSQL 简介 3. MongoDB 简介 4. Windows 平台安装 MongoDB 5. Linux 平台安装 MongoDB 6. MongoDB 概念解析 7. MongoDB 连接 8. MongoDB 插入文档 9. MongoDB 更新文档 10. MongoDB 删除文档 11. MongoDB 查询文档 12. MongoDB 条件操作符 13. MongoDB $type 操作符 14. MongoDB Limit与Skip方法 15. MongoDB 排序 16. MongoDB 索引 17. MongoDB 聚合 18. MongoDB 复制(副本集) 19. MongoDB 分片 20. MongoDB 备份(mongodump)与恢复(mongorestore) 21. MongoDB 监控 22. MongoDB Java 23. MongoDB PHP 24. MongoDB 关系 25. MongoDB 数据库引用 26. MongoDB 覆盖索引查询 27. MongoDB 查询分析 28. MongoDB 原子操作 29. MongoDB 高级索引 30. MongoDB 索引限制 31. MongoDB ObjectId 32. MongoDB Map Reduce 33. MongoDB 全文检索 34. MongoDB 正则表达式 35. MongoDB 管理工具: Rockmongo 36. MongoDB GridFS 37. MongoDB 固定集合(Capped Collections) 38. MongoDB 自动增长

MongoDB GridFS

MongoDB GridFS

GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。

GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。

GridFS 可以更好的存储大于16M的文件。

GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。

每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

以下是简单的 fs.files 集合文档:


{

   "filename": "test.txt",

   "chunkSize": NumberInt(261120),

   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),

   "md5": "7b762939321e146569b07f72c62cca4f",

   "length": NumberInt(646)

}

以下是简单的 fs.chunks 集合文档:


{

   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),

   "n": NumberInt(0),

   "data": "Mongo Binary Data"

}


GridFS 添加文件

现在我们使用 GridFS 的 put 命令来存储 mp3 文件。 调用 MongoDB 安装目录下bin的 mongofiles.exe工具。

打开命令提示符,进入到MongoDB的安装目录的bin目录中,找到mongofiles.exe,并输入下面的代码:


>mongofiles.exe -d gridfs put song.mp3

-d gridfs 指定存储文件的数据库名称,如果不存在该数据库,MongoDB会自动创建。如果不存在该数据库,MongoDB会自动创建。Song.mp3 是音频文件名。

使用以下命令来查看数据库中文件的文档:


>db.fs.files.find()

以上命令执行后返回以下文档数据:


{

   _id: ObjectId('534a811bf8b4aa4d33fdf94d'), 

   filename: "song.mp3", 

   chunkSize: 261120, 

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10401959 

}

我们可以看到 fs.chunks 集合中所有的区块,以下我们得到了文件的 _id 值,我们可以根据这个 _id 获取区块(chunk)的数据:


>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

以上实例中,查询返回了 40 个文档的数据,意味着mp3文件被存储在40个区块中。