云上MongoDB常见索引问题及最优索引规则大全

云上MongoDB常见索引问题及最优索引规则大全,第1张

MongoDB 将数据记录存储为 BSON类型的 文档(document)。 BSON 是一种二进制数据类型,是json 的一种扩展, bson 支持了更多的数据类型。 下图就是一个document(文档) 示例:

document 的数据结构如下所示:由若干个字段-值对组成,其中字段的值可以是任何 BSON 数据类型 ,包括嵌入式数据结构如 其他文档、数组和文档数组等。

如下申明了一个mydoc 的文档,

字段(field)的命名都是由字符串组成

字段名称有以下几条限制:

对于不同的字段类型的存储 *** 作,字段名称验证规则并不相同。下面总结了不同的插入和更新 *** 作如何处理以美元 ($) 为前缀的字段名称

修改非 $ 前缀的字段

修改非 $ 前缀的最外层字段,通过 literal 实现

使用管道创建一个名为spring2022的新集合,更新 $ 为前缀的 $term 字段

MongoDB 使用点符号来访问数组的元素和访问嵌入文档的字段

要通过从零开始的索引位置指定或访问数组的元素,请将数组名称与点 () 和从零开始的索引位置连接起来,并用引号引起来

示例:

要使用点表示法指定或访问嵌入文档的字段,请将嵌入文档名称与点 () 和字段名称连接起来,并用引号引起来

示例:

BSON 文档的最大大小为 16 兆字节

最大文档大小有助于确保单个文档不会使用过多的 RAM,或者在传输期间不会使用过多的带宽。为了存储大于最大大小的文档,MongoDB 提供了 GridFS API。

与 JavaScript 对象不同,BSON 文档中的字段是有序的

查询 *** 作时字段顺序:

写 *** 作时字段顺序

对于写入 *** 作,MongoDB 保留文档字段的顺序,但以下情况除外:

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了 _id 字段,MongoDB 驱动程序会自动为 _id 字段生成一个 ObjectId。 这也适用于通过带有 upsert: true 的更新 *** 作插入的文档

_id 字段具有以下限制:

_id 字段常用值:

对数据进行聚合 *** 作,然后将计算之后的数据返回。聚合 *** 作将多个文档的值组合在依赖,并且可以对分组数据执行各种 *** 作返回单个结果。

MongoDB提供三种方式来执行聚合 *** 作:aggregation pipeline、map-reduce function、single purpose aggregation methods。

MongoDB 聚合 *** 作是在数据处理管道的逻辑上建模的。documents可以进入一个用于处理docuemnt然后返回聚合值的多阶段管道。

底层的管道提供了filters(类似于查询的 *** 作)和document transformations(修改document的输出形式) *** 作。

其他管道 *** 作为document指定具体的属性或者多个属性进行分组和排序,以及用array内容的聚合工具一样。管道的阶段可以使用运算符执行任务。

管道使用MongoDB自带的本地 *** 作来执行聚合 *** 作更高效,管道是MongoDB执行聚合 *** 作的首先。

聚合管道可以 *** 作分片collection。聚合管道可以通过使用索引来提高性能。聚合管道内部会进行优化阶段。

可以使用dbcollectionaggregate()的explain参数看到执行计划。

聚合管道来决定需要返回的字段。如果使用只需要的字段,这样可以减少数据量。

addFields + match放入到 addFields之前(如果是 project / $addFields的结果,就不能移动),减少数据量。

match: 先执行$match来减少数据量,然后在执行排序 *** 作。

match: 如果在前面添加$match *** 作,可以使用索引来减少数据 *** 作。

skip(在32开始可以使用):将 project *** 作之前,可以减少数据量。

通常情况下,在重新排序优化之后才会发生阶段合并。

limit:如果不能减少数据量,不会将这两个阶段合并。否则先进行排序,然后获取指定的数量,放入内存。如果在中间含有$skip *** 作,将其放入最后。

在数据量超过内存限制,这个 *** 作需要设置 allowDiskUse=true。

从MongoDB36开始,删除了aggregate的选项,将结果作为一条数据的返回。

aggregate可以返回cursor或者数据结果集。在返回的结果中,每个document的大小不能超过16M(这个限制只针对返回的document)。

documents有可能会超过这个限制,dbcollectionaggregate()默认返回cursor。

从MongoDB26开始,管道阶段的RAM限制为100M。如果超过限制,出错。如果为了处理大量的数据集,使用allowDiskUse选项开启管道阶段的聚合 *** 作将数据写入到临时文件。

从MongoDB34之后, graphLookup *** 作会忽略这个选项。如果其他阶段有aggregate() *** 作,allowDiskUse=true将会影响这些阶段。

从MongoDB32开始,如果按照分片来匹配值,只会在这个分片内进行计算。

聚合 *** 作在多个分片上执行 *** 作,如果没有指定主分片,这些 *** 作会被路由到其他分片上,来减少主分片的负载。

lookup阶段需要在主分片上执行查询。

将聚合管道拆分为两部分,这是为了在分片上执行优化。

*** 作可以 参考实例

MapReduce可以在分片上执行 *** 作,分片集合可以作为输入或者输出。

使用分片集合作为MapReduce输入源,mongos将作业并行派发到各个分片。mongos会等待所有的作业完成。

如果MapReduce的out字段有分片值,MongoDB使用_id字段作为分片的依据。

作为一个分片集合输出:

在 *** 作的过程中,mapreduce有很多锁:

相关 练习教程

以上就是关于云上MongoDB常见索引问题及最优索引规则大全全部的内容,包括:云上MongoDB常见索引问题及最优索引规则大全、mongodb怎么查询数组中的值、mongoDB-document等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10151396.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存