【mongo 系列】mongodb 学习七,索引实操练习

简介: 向 mydoc 集合中,插入多条数据,mydoc 之前是没有存在过的,我们直接使用 db.mydoc.insertMany() ,mongodb 会默认给我们新建这个集合

数据准备

向 mydoc 集合中,插入多条数据,mydoc 之前是没有存在过的,我们直接使用  db.mydoc.insertMany() ,mongodb 会默认给我们新建这个集合

db.mydoc.insertMany([
   { item:"canvas", qty:120, size:{ h:28, w:35.5, uom:"cm" }, status:"A", createDate:ISODate("2016-02-06T20:20:13Z") },
   { item:"journal", qty:25, tags:[ {tag:"gray", type:"paper"}, {tag:"red", type:"electron"} ], size:{ h:14, w:21, uom:"cm" }, status:"A", createDate:ISODate("2016-02-07T20:20:13Z") },
   { item:"notebook", qty:50, tags:[ {tag:"yellow", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:8.5, w:11, uom:"in" }, status:"P", createDate:ISODate("2016-02-08T20:20:13Z")},
   { item:"paper", qty:100, tags:[{tag:"yellow", type:"paper"}, {tag:"brown", type:"electron"}], size:{ h:8.5, w:11, uom:"in" }, status:"D", createDate:ISODate("2016-02-09T20:20:13Z") },
   { item:"planner", qty:75, tags:[{tag:"yellow", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:22.85, w:30, uom:"cm" }, status:"D", createDate:ISODate("2016-02-10T20:20:13Z") },
   { item:"postcard", qty:45, tags:[{tag:"black", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:10, w:15.25, uom:"cm" }, status:"P", createDate:ISODate("2016-02-11T20:20:13Z") },
   { item:"sketchbook", qty:80, status:"A", createDate:ISODate("2016-02-12T20:20:13Z") }
]);

插入成功

image.png

单字段索引

使用单字段索引,根据物品名称查询物品

db.mydoc.createIndex({item:1})

image.png

使用 db.mydoc.getIndexes() 查看所有索引,可以查看到刚才我们创建的索引 item_1 , 其中 _id_ 是默认索引

> db.mydoc.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "mytest.mydoc"
        },
        {
                "v" : 2,
                "key" : {
                        "item" : 1
                },
                "name" : "item_1",
                "ns" : "mytest.mydoc"
        }
]
>


我们来查询一下数据,看看是否命中索引

> db.mydoc.find().sort({item:1}).explain()

image.png

通过上图我们可以看到,已经命中索引,并且索引范围是 [MinKey, MaxKey],如果我们查询的时候,sort 里面排序为倒序(-1),那么此处的索引范围就是到过来的  [MaxKey, MinKey] ,感兴趣的 xdm 可以尝试一下

尝试不加 sort

如果我们直接 db.mydoc.find().explain() 是不会命中索引的,,mongodb 会默认走 全文索引

image.png

复合索引

索引的顺序跟查询排序相关联

创建复合索引,status 字段 做升序,qty 字段做降序

db.mydoc.createIndex({status:1, qty:-1})

我们创建的索引一升一降,查询排序的模式必须与索引键的模式匹配或逆向,也就是说,我们查询的时候,

可以是 {status:-1, qty:1} 也可以是{status:1, qty:-1}

但是不能 {status:-1, qty:-1} 也不能  {status:1, qty:1}

因为这样的查询顺序是和我们的索引矛盾的,这两种模式是不能被命中索引的

TLL 索引

数据准备

新建一个 日志集合,插入多条数据,带上最后修改的时间

db.eventlog.insert(
[
    {system:"trade", lastModifiedDate:ISODate("2017-11-12T20:20:13Z"), context:"NullPointException, "},
    {system:"goods", lastModifiedDate:ISODate("2017-11-15T20:21:13Z"), context:"NullPointException, "},
    {system:"mongodb", lastModifiedDate:ISODate("2017-11-16T20:22:13Z"), context:"2019-11-12 18:18:52.426 [main] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:2, serverValue:2409}"}
]
)

执行结果

image.png

查询一下 eventlog

> db.eventlog.find()
{ "_id" : ObjectId("615eb334631f5c41fb6c6c16"), "system" : "trade", "lastModifiedDate" : ISODate("2017-11-12T20:20:13Z"), "context" : "NullPointException, " }
{ "_id" : ObjectId("615eb334631f5c41fb6c6c17"), "system" : "goods", "lastModifiedDate" : ISODate("2017-11-15T20:21:13Z"), "context" : "NullPointException, " }
{ "_id" : ObjectId("615eb334631f5c41fb6c6c18"), "system" : "mongodb", "lastModifiedDate" : ISODate("2017-11-16T20:22:13Z"), "context" : "2019-11-12 18:18:52.426 [main] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:2, serverValue:2409}" }

创建一个 TLL 索引

创建索引的字段是日期或者是日期数组,不是这种类型的字段,是不会删除文档的

设置 30秒 后过期,会话、日志,会话过期后会删除集合

> db.eventlog.createIndex({"lastModifiedDate":1}, {expireAfterSeconds:30})

image.png

30 s 之后,我们再来查询一下数据

db.eventlog.find()

果然是查询不到结果的,文档数据被删除掉了,索引还会在吗?

> db.eventlog.getIndexes()

image.png

hash 索引

数据准备

插入一些数据

db.mydoc.drop() // 清空表
db.mydoc.insertMany([
   { item:"canvas", qty:120, size:{ h:28, w:35.5, uom:"cm" }, status:"A", createDate:ISODate("2016-02-06T20:20:13Z") },
   { item:"journal", qty:25, tags:[ {tag:"gray", type:"paper"}, {tag:"red", type:"electron"} ], size:{ h:14, w:21, uom:"cm" }, status:"A", createDate:ISODate("2016-02-07T20:20:13Z") },
   { item:"notebook", qty:50, tags:[ {tag:"yellow", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:8.5, w:11, uom:"in" }, status:"P", createDate:ISODate("2016-02-08T20:20:13Z")},
   { item:"paper", qty:100, tags:[{tag:"yellow", type:"paper"}, {tag:"brown", type:"electron"}], size:{ h:8.5, w:11, uom:"in" }, status:"D", createDate:ISODate("2016-02-09T20:20:13Z") },
   { item:"planner", qty:75, tags:[{tag:"yellow", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:22.85, w:30, uom:"cm" }, status:"D", createDate:ISODate("2016-02-10T20:20:13Z") },
   { item:"postcard", qty:45, tags:[{tag:"black", type:"paper"}, {tag:"green", type:"electron"}], size:{ h:10, w:15.25, uom:"cm" }, status:"P", createDate:ISODate("2016-02-11T20:20:13Z") },
   { item:"sketchbook", qty:80, status:"A", createDate:ISODate("2016-02-12T20:20:13Z") }
]);

创建 hash 索引

> db.mydoc.createIndex({item:"hashed"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

查看 hash 索引是否命中

> db.mydoc.find({item:"paper"}).explain()

image.png

图中可以看出, IXSCAN 表示为已经命中 hash 索引

空间索引

二维索引球体索引 ,官网上可以看这里

docs.mongodb.com/manual/core…

我们来实践一下 球体索引

球体空间索引,2dsphere。

支持类似地球球体上的位置,可以存放 GeoJSON 、传统坐标类型的数据。

GeoJSON数据

需要使用嵌入式文档存放,coordinates 指定坐标位置,type 指定坐标类型

Type 有如下 3 种形式

  • point

例如可以这样写:location: { type: "Point", coordinates: [-33.856077, 30.848447] }

  • lineString

例如可以这样写:location: { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

  • polygon

例如可以这样写:`location: { type: "Polygon",

coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ]

}`

传统坐标数据

一个字段即可指定坐标位置。

GeoJSON数据 和 传统坐标数据 两种类型数据,经纬度的存储方式必须是 [经度,纬度] 的数组形式

开始实践,数据准备

在 places 集合中插入 2个文档数据

db.places.insert([
   {
      loc:{ type:"Point", coordinates:[ -73.97, 40.77 ] },
      name:"Central Park", category:"Parks"
   },
   {
      loc:{ type:"Point", coordinates:[ -73.88, 40.78 ] },
      name:"La Guardia Airport", category:"Airport"
   }
]);

创建球体空间索引

db.places.createIndex( { loc:"2dsphere" } )

查看索引

> db.places.getIndexes()

image.png

创建空间索引的复合索引

db.places.createIndex( { loc:"2dsphere" , category:-1, name:1 } )

查看索引可以看到

image.png


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
10月前
|
存储 NoSQL MongoDB
微服务——MongoDB常用命令——MongoDB索引知识概述
本文介绍MongoDB索引相关知识,包括其在查询中的重要作用。索引可避免全集合扫描,显著提升查询效率,尤其在处理海量数据时。通过B树数据结构存储字段值并排序,支持相等匹配、范围查询及排序操作。文中还提供了官方文档链接以供深入学习。
179 0
|
10月前
|
存储 NoSQL MongoDB
微服务——MongoDB常用命令——MongoDB索引的类型
本节介绍了MongoDB中索引的几种类型及其特点。包括单字段索引,支持升序/降序排序,索引顺序对操作无影响;复合索引,字段顺序重要,可实现多级排序;地理空间索引,支持平面与球面几何查询;文本索引,用于字符串搜索并存储词根;哈希索引,基于字段值散列,适合等值匹配但不支持范围查询。
250 1
微服务——MongoDB常用命令——MongoDB索引的类型
|
10月前
|
存储 NoSQL 定位技术
MongoDB索引知识
MongoDB索引是提升查询性能的关键工具,通过构建特殊的数据结构(如B树)优化数据访问路径。无索引时,查询需全集合扫描,时间复杂度为O(n);使用索引后可降至O(log n),实现毫秒级响应。MongoDB支持多种索引类型:单字段索引适用于高频单字段查询;复合索引基于最左前缀原则优化多条件过滤和排序;专业索引包括地理空间索引(支持LBS服务)、文本索引(全文搜索)和哈希索引(分片键优化)。合理选择和优化索引类型,可显著提升数据库性能。建议使用explain()分析查询计划,并定期清理冗余索引。
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
496 15
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引知识
122 1
MongoDB索引知识
|
存储 NoSQL MongoDB
MongoDB 索引限制
10月更文挑战第22天
224 2
|
NoSQL MongoDB 索引
MongoDB 高级索引
10月更文挑战第22天
111 2
|
6月前
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
6月前
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
494 79
|
6月前
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
299 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉

推荐镜像

更多