MongoDB实战(3)固定集合与GridFS

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

一、固定集合(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 中能够存放的最大文档数。但这时也要指
定 size,因为总是先检查 size 后检查 maxRowNumber。
可以使用 validate()查看一个 collection已经使用了多少空间,从而决定 size 设为多大。

下面我们创建一个集合:

1
db.createCollection( 'mycappc1' ,{capped: true ,size:100000,max:10})

这是一个最多10行记录的固定集合。

151830737.png

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

152138817.png

查看以使用多少空间:

191757534.png

上 述 的 createCollection 函 数 也 可 以 用 来 创 建 一 般 的 collection , 还 有 一 个 参 数
"autoIndexID",值可以为"true"和"false"来决定是否需要在"_id"字段上自动创建索引。

如下:

1
db.createCollection( 'mycappc2' ,{capped: true ,size:100000,max:10,autoIndexId: false })

则表没有索引,对于写多读少的表非常合适

192109530.png


二、GridFS

GridFS 是一种将大型文件存储在 MongoDB 数据库中的文件规范。
由于 MongoDB 中 BSON 对象大小是有限制的,所以 GridFS 规范提供了一种透明的机制,可
以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,
特别对于那些巨大的文件,比如视频、高清图片等。

GridFS 使用两个表来存储数据:
files 包含元数据对象
chunks 包含其他一些相关信息的二进制块
为了使多个 GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀
是 fs,所以任何默认的 GridFS 存储将包括命名空间 fs.files 和 fs.chunks。各种第三方语言的
驱动有权限改变这个前缀,所以你可以尝试设置另一个 GridFS 命名空间用于存储照片,它
的具体位置为:photos.files 和 photos.chunks。下面我们看一下实际的例子吧。
这里使用命令行工具

1
2
3
4
5
6
7
8
9
/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

接下来我们进库里看一下是否有新的东西
193542269.png

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

193700268.png

其中比较重要的字段是”n”,它代表的是 chunks 的序号,此序号从 0 开始,看来 fs.chunks
中存储的是一些实际的内容数据信息。

我们即然能将此文件存进去,我们就应该有办法将其取出来,下面看一下实例:
194359896.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});
194745561.png




















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1323475,如需转载请自行联系原作者
相关文章
|
8月前
|
存储 NoSQL API
微服务——MongoDB实战演练——需求分析
本文档《5-MongoDB实战演练》聚焦于某头条文章评论业务的需求分析与功能实现。基于MongoDB,需完成以下功能:1)提供基本的增删改查API;2)支持通过文章ID查询相关评论;3)实现评论点赞功能。结合实际业务场景,演示MongoDB在数据存储与操作中的应用,附带示意图帮助理解业务结构。
128 2
微服务——MongoDB实战演练——需求分析
|
8月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
168 2
|
8月前
|
NoSQL Java MongoDB
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
148 2
|
8月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
179 0
|
8月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
137 0
|
8月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章微服务模块搭建
本节介绍文章微服务模块的搭建过程,主要包括以下步骤:(1)创建项目工程 *article*,并在 *pom.xml* 中引入依赖;(2)配置 *application.yml* 文件;(3)创建启动类 *cn.itcast.article.ArticleApplication*;(4)启动项目,确保控制台无错误提示。通过以上步骤,完成文章微服务模块的基础构建与验证。
110 0
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
364 1
|
8月前
|
NoSQL Java 测试技术
MongoDB实战演练
本文介绍了基于Spring Boot和MongoDB实现文章评论功能的完整流程。主要包括需求分析、表结构设计、技术选型(如mongodb-driver与SpringDataMongoDB)、项目搭建及配置、实体类编写、基本增删改查功能实现、分页查询以及点赞功能的开发。通过Comment实体类、CommentRepository接口和CommentService服务层,实现了评论的存储、查询及更新操作,并利用MongoTemplate优化了点赞功能的性能。最后通过JUnit测试验证各功能的正确性。该方案适合需要高效处理非结构化数据的文章评论系统开发。
MongoDB实战演练
|
8月前
|
NoSQL MongoDB 数据库
微服务——MongoDB实战演练——表结构分析
本文档来源于数据库articledb,展示了一张图片资源。图片宽度为1207像素,高度607像素,采用内联显示方式。内容涉及图像处理与样式设定,适用于文档或网页设计中多媒体元素的布局参考。图片来源为cdn.nlark.com,支持webp格式并附带水印处理。
112 1
微服务——MongoDB实战演练——表结构分析
|
8月前
|
NoSQL Java 数据库连接
微服务——MongoDB实战演练——技术选型
本节主要介绍技术选型中的两个重要工具:**mongodb-driver** 和 **SpringDataMongoDB**。其中,mongodb-driver 是 MongoDB 官方提供的 Java 驱动包,用于连接和操作 MongoDB 数据库,功能类似 JDBC 驱动。通过官方示例可快速上手。而 SpringDataMongoDB 是 Spring 生态的一员,封装了 mongodb-driver,提供了更简洁的 API,方便开发者在 Spring 环境中操作 MongoDB。两者各有优势,可根据实际需求选择合适的技术方案。
137 2

推荐镜像

更多