6.MongoDB系列之特殊索引和集合类型
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系列之特殊索引和集合类型的更多相关文章
- MongoDB系列四(索引).
一.索引简介 再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似.有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高 ...
- Mongodb 笔记04 特殊索引和集合、聚合、应用程序设计
特殊索引和集合 1. 固定集合:固定集合需要事先创建好看,而且它的大小是固定的.当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除. 2. 创建固定集合:db.createC ...
- Scala 系列(六)—— 常用集合类型之 List & Set
一.List字面量 List 是 Scala 中非常重要的一个数据结构,其与 Array(数组) 非常类似,但是 List 是不可变的,和 Java 中的 List 一样,其底层实现是链表. scal ...
- Scala 系列(七)—— 常用集合类型之 Map & Tuple
一.映射(Map) 1.1 构造Map // 初始化一个空 map val scores01 = new HashMap[String, Int] // 从指定的值初始化 Map(方式一) val s ...
- MongoDB系列一(索引及C#如何操作MongoDB)
索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureIndex({"username": ...
- 4.MongoDB系列之索引(一)
1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大 ...
- MongoDB系列(二):C#应用
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
- MongoDB学习笔记-04 索引
索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...
- 【mongoDB中级篇②】索引与expain
索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...
随机推荐
- PureRandom采样类定义和测试
此是随机采样算法,效果感觉一般般. 类声明: #pragma once #ifndef __PURERANDOM_HEADER__ #define __PURERANDOM_HEADER__ #inc ...
- Luogu2439 [SDOI2005]阶梯教室设备利用 (动态规划)
同上一题,区间改左闭右开就双倍经验了.貌似可以跑最长路. #include <iostream> #include <cstdio> #include <cstring& ...
- thinkphp 5 及一下或php项目里实现模糊查询
想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...
- 100行代码实现一个RISC-V架构下的多线程管理框架
1. 摘要 本文将基于RISC-V架构和qemu仿真器实现一个简单的多线程调度和管理框架, 旨在通过简单的代码阐明如何实现线程的上下文保存和切换, 线程的调度并非本文的重点, 故线程调度模块只是简单地 ...
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- Silk语言-中国人自己的开源编程语言
什么是Silk Silk语言是一门完全独立自主开发的跨平台动态类型编程语言,绝非"木兰"等套壳语言. Silk简单易学,30分钟即可掌握全部语法,让你像Python一样简单地写C/ ...
- PerfView专题 (第十一篇):使用 Diff 功能洞察 C# 内存泄漏增量
一:背景 去年 GC架构师 Maoni 在 (2021 .NET 开发者大会) [https://ke.segmentfault.com/course/1650000041122988/section ...
- [BZOJ3625][CF438E]小朋友和二叉树 (多项式开根,求逆)
题面 题解 设多项式的第a项为权值和为a的二叉树个数,多项式的第a项表示是否为真,即 则,所以F是三个多项式的卷积,其中包括自己: ,1是F的常数项,即. 我们发现这是一个一元二次方程,可以求出,因为 ...
- 轻量级消息队列 Django-Q 轻度体验
前言 最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位. 这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件 Celery实在是太重了,后来我做公众 ...
- 【Android 逆向】switch 的smail特征
JAVA 源码 ... String str1 = packedSwitch(1); ... private String packedSwitch(int i) { String str = nul ...