设为首页 收藏本站
查看: 1195|回复: 0

[经验分享] MongoDB实战(3)固定集合与GridFS-Coder

[复制链接]

尚未签到

发表于 2018-10-27 10:44:51 | 显示全部楼层 |阅读模式
  一、固定集合(Capped Collection)
  capped collections 是性能出色的有着固定大小的集合,以 LRU(Least Recently Used 最近最少使用)规则和插入顺序进行 age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。
  可以插入及更新,但更新不能超出 collection 的大小,否则更新失败。不允许删除,但是可以调用 drop() 删除集合中的所有行,但是 drop 后需要显式地重建集合。
  常见用处:
  1、 logging
  MongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数
  据库中。在一个没有索引的 capped collection 中插入对象的速度与在文件系统中记录日
  志的速度相当。
  2、 cache
  缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在 collection 上建立
  一个索引,因为使用缓存往往是读比写多。
  3、 auto archiving
  可以利用 capped collection 的 age-out 特性,省去了写 cron 脚本进行人工归档的工作。
  推荐用法:
  1、 为了发挥 capped collection 的最大性能,如果写比读多,最好不要在上面建索引,否则
  插入速度从"log speed"降为"database speed"。
  2、使用"nature ordering"可以有效地检索最近插入的元素,因为 capped collection 能够保证
  自然排序就是插入时的顺序,类似于 log 文件上的 tail 操作。
  实际案例:
  可以在创建 capped collection 时指定 collection 中能够存放的最大文档数。但这时也要指

  定>
  可以使用 validate()查看一个 collection已经使用了多少空间,从而决定>  下面我们创建一个集合:
db.createCollection('mycappc1',{capped:true,size:100000,max:10})  这是一个最多10行记录的固定集合。
DSC0000.png

  当我们插入10条记录后,再有新的插入时,最老的一条将会被剔除,看看如下效果:
DSC0001.png

  查看以使用多少空间:
DSC0002.png

  上 述 的 createCollection 函 数 也 可 以 用 来 创 建 一 般 的 collection , 还 有 一 个 参 数
  "autoIndexID",值可以为"true"和"false"来决定是否需要在"_id"字段上自动创建索引。
  如下:
db.createCollection('mycappc2',{capped:true,size:100000,max:10,autoIndexId:false})  则表没有索引,对于写多读少的表非常合适
DSC0003.png

  二、GridFS
  GridFS 是一种将大型文件存储在 MongoDB 数据库中的文件规范。
  由于 MongoDB 中 BSON 对象大小是有限制的,所以 GridFS 规范提供了一种透明的机制,可
  以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,
  特别对于那些巨大的文件,比如视频、高清图片等。
  GridFS 使用两个表来存储数据:
  files 包含元数据对象
  chunks 包含其他一些相关信息的二进制块
  为了使多个 GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀
  是 fs,所以任何默认的 GridFS 存储将包括命名空间 fs.files 和 fs.chunks。各种第三方语言的
  驱动有权限改变这个前缀,所以你可以尝试设置另一个 GridFS 命名空间用于存储照片,它
  的具体位置为:photos.files 和 photos.chunks。下面我们看一下实际的例子吧。
  这里使用命令行工具
/usr/bin/mongofiles put /tmp/testfile  
#结果如下
  
connected to: 127.0.0.1
  
added file: { _id: ObjectId('5280bfc58bf9a82c5ba2abc4'), filename: "/tmp/testfile", chunkSize: 262144, uploadDate: new Date(1384169413607), md5: "21395b76d80f48cc069fa90d0c639513", length: 29 }
  
done!
  
#查看
  
/usr/bin/mongofiles list
  
connected to: 127.0.0.1
  
/tmp/testfile   29
  接下来我们进库里看一下是否有新的东西
DSC0004.png

  字段说明:
  Filename: 存储的文件名
  chunkSize: chunks 分块的大小
  uploadDate: 入库时间
  md5: 此文件的 md5 码
  length: 文件大小, 单位”字节”
  看来 fs.files 中存储的是一些基础的元数据信息
DSC0005.png

  其中比较重要的字段是”n”,它代表的是 chunks 的序号,此序号从 0 开始,看来 fs.chunks
  中存储的是一些实际的内容数据信息。
  我们即然能将此文件存进去,我们就应该有办法将其取出来,下面看一下实例:
DSC0006.png

  -校验 md5,结果跟库里相同
  db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});
  这样,一个块就可以利用它的 files_id 和 n 的值进行检索。注意,GridFS 仍然可以用 findOne
  得到第一个块,如下:
  db.fs.chunks.findOne({files_id: myFileID, n: 0});
DSC0007.png




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627046-1-1.html 上篇帖子: MongoDB实战(2)工具集与特殊魔术方法 下篇帖子: MongoDB实战(4)MapReduce-Coder
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表