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": { }
}