1. 地理空间索引及全文搜索

与Elasitcsearch一样,MongoDB同样支持地理空间索引及全文搜索,由于选型常用ES而非MongoDB此处略过

2. TTL索引

首先先了解下固定集合,其类似于循环队列 ,当满的时候,最旧的文档会被覆盖。而TTL索引允许允许为每个文档设置一个超时时间,当一个文档过期时就会被删除。这种类型的索引对于类似会话保存这样的缓存场景非常有用。

//  设置TTL索引,过期时间为24小时
db.getCollection('sessions').createIndex({'lastUpdated': 1}, {'expireAfterSeconds': 60*60*24})
3. 使用GridFS存储文件

GridFS是MongoDB存储大型二进制文件的一种机制

优点:

  • 使用GridFS能够简化技术栈, 如果项目已在使用MongoDB,呢么可以使用GridFS代替独立的文件存储工具
  • GridFS可以利用MongoDB已经设置好的复制或自动分片机制,因此实现故障转移与横向扩展容易些
  • GridFS没有在同一个目录下存储大量文件的问题

缺点:

  • 性能比较低。不如 从文件系统访问文件速度快
  • 修改文档,需要先删除,后重新保存。因为MongoDB会将文件作为多个文档进行存储,无法对同一文件的所有块进行枷锁
3.1 GridFS存储示例

可以使用mongofile进行上传查看

mongofiles --uri mongodb://admin:admin@127.0.0.1:27017/study?authSource=admin -l ok.txt put ok.txt

2022-07-09T16:11:52.620+0800    connected to: mongodb://[**REDACTED**]@127.0.0.1:27017/study?authSource=admin
2022-07-09T16:11:52.750+0800 added gridFile: ok.txt
3.2 GridFS底层机制

GridFS背后的理念是将大文件分割为多个,并将每个块作为独立的文档进行存储。文档的结构如下

{
// 块唯一ID
"_id": ObjectId("..."),
// 块在文件中的相对位置
"n": 0,
// 块所包含的二进制数据
"data": BinData("..."),
// 此块所属文件元数据的文档ID
"files_id": ObjectId("...")
}

每个文件的元数据保存在一个单独的集合中,默认情况下是fs.files,可以执行db.fs.files.find({})查看结果

{
// 文件的唯一ID
"_id": ObjectId("62c93848cf13162ba9c71cad"),
// 文件总字节数
"length": NumberLong("2"),
// 组成文件的每个块的大小
"chunkSize": NumberInt("261120"),
// 上传时间
"uploadDate": ISODate("2022-07-09T08:11:52.747Z"),
"filename": "ok.txt",
"metadata": { }
}

欢迎关注公众号算法小生沈健的技术博客

6.MongoDB系列之特殊索引和集合类型的更多相关文章

  1. MongoDB系列四(索引).

    一.索引简介 再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似.有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高 ...

  2. Mongodb 笔记04 特殊索引和集合、聚合、应用程序设计

    特殊索引和集合 1. 固定集合:固定集合需要事先创建好看,而且它的大小是固定的.当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除. 2. 创建固定集合:db.createC ...

  3. Scala 系列(六)—— 常用集合类型之 List & Set

    一.List字面量 List 是 Scala 中非常重要的一个数据结构,其与 Array(数组) 非常类似,但是 List 是不可变的,和 Java 中的 List 一样,其底层实现是链表. scal ...

  4. Scala 系列(七)—— 常用集合类型之 Map & Tuple

    一.映射(Map) 1.1 构造Map // 初始化一个空 map val scores01 = new HashMap[String, Int] // 从指定的值初始化 Map(方式一) val s ...

  5. MongoDB系列一(索引及C#如何操作MongoDB)

    索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureIndex({"username": ...

  6. 4.MongoDB系列之索引(一)

    1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大 ...

  7. MongoDB系列(二):C#应用

    前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...

  8. MongoDB学习笔记-04 索引

    索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...

  9. 【mongoDB中级篇②】索引与expain

    索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...

随机推荐

  1. Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_152 短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务 ...

  2. 论语音社交视频直播平台与 Apache DolphinScheduler 的适配度有多高

    在 Apache DolphinScheduler& Apache ShenYu(Incubating) Meetup 上,YY 直播 软件工程师 袁丙泽 为我们分享了<YY直播基于Ap ...

  3. ENSP 与VMware workstation 同时安装会出现AR40 或者VMware蓝屏

    前言: 你已经安装了VMware workstation,ENSP,Virtualbox,并且关闭了hyper-v,还会出现报错或者VMware蓝屏. #此处补充一条命令systeminfo 如果你看 ...

  4. 使用docker简单编译k20pro内核

    简介 本文将介绍一下如何使用docker编译红米k20pro的内核.作者当时尝试构建内核的原因是为了将3年前(好像是吧)购买的k20pro至尊版(已退役,12GB内存,512GB硬盘)制作成一个小的服 ...

  5. HTML(下)

    (一)表格标签 1.表格的作用 用于显示.展示数据,让数据更加规整,可读性更好,把繁琐的数据表现得很有条理,表格不是用来布局页面的,而是用来展示数据的 2.表格标签基本语法 table--table ...

  6. 一 策略模式 来自CBF4LIFE 的设计模式

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景中 ...

  7. xtrabackup增量备份MySQL-5.7操作说明

    下载工具 本方法利用xtrabackup二进制包,版本是2.4.26 # 从官网下载二进制包:wget https://downloads.percona.com/downloads/Percona- ...

  8. Linux或Docker里安装minio / Docker中安装h5ai

    此文为单节点搭建操作 Linux中搭建minio 对象存储服务器 下载minio安装包 wget https://dl.minio.io/server/minio/release/linux-amd6 ...

  9. centos7部署Prometheus+Grafana

    一.安装Prometheus Server 请从 Prometheus 官方下载 linux 版的二进制压缩包.注意在下载前要选择操作系统为 linux. 执行下面的命令把 prometheus se ...

  10. JAVA中方法的调用主要有以下几种

    JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...