登录
首页 >  Golang >  Go问答

使用 bson.D 和 bson.M 进行查询操作

来源:stackoverflow

时间:2024-03-15 13:54:25 216浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《使用 bson.D 和 bson.M 进行查询操作》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

这个具体问题与使用 mongodb 和 golang 包 mongo-driver 有关,但我认为这适用于大多数 mongodb 接口。

当使用Find从集合中查询某些数据时,我们可以使用bson.M-和bson.D-类型来指定此查找的过滤器。

根据文档,如果元素的顺序很重要,则应使用 bson.D,否则应使用 bson.M

D 是 BSON 文档的有序表示。当元素的顺序很重要时(例如 MongoDB 命令文档),应使用此类型。如果元素的顺序不重要,则应使用 M 代替。

现在我的问题是使用这两种结构(即有序结构与无序结构)是否会对 mongo 查询优化器生成的查询计划产生影响。

在经典的 SQL 数据库中,顺序通常并不重要,因为优化器足够智能,可以使用摘要统计信息、索引等来确定首先执行哪些查询。

我是否可以假设这里也是这种情况,或者使用有序结构来查询我的集合是否会以某种方式干扰此/使用有序结构是否与使用优化器提示类似?如果存在一些干扰,这是否会受到要搜索的字段是否被索引的影响?


解决方案


您可以使用 bson.M 作为过滤器,它通常会导致更短、更清晰的过滤器声明,字段的顺序并不重要,MongoDB 服务器足够智能,可以找到匹配的索引,无论使用的顺序如何。例如。如果您有包含字段 AB 的复合索引,则首先使用 bson.D 过滤器列出 B,然后 A 将不会阻止服务器使用现有索引。所以在这种情况下你可以使用bson.Mbson.D,这并不重要。

例如,当您指定排序字段时,顺序确实很重要。如果您按字段 A 排序,然后按字段 B 排序,这可能与先按 B 然后按 A 排序完全不同。因此,当您指定具有多个字段的排序文档时,您一定应该使用bson.D

例如,当您插入新文档时,顺序也可能很重要(对)。如果您使用 bson.M 作为文档,则不能保证所有文档中的字段顺序相同。当您使用 bson.D 时,保存的文档中的顺序将与您在 bson.D 中列出字段的顺序匹配。

关键顺序适用于有线协议,而不是查询执行。

在 MongoDB 中,BSON 文档是键值对的有序列表。

BSON 用于序列化存储在集合中的文档以及“命令文档”,即发送到服务器的命令。

当服务器处理命令时,它要求命令名称是第一个键(记住键是有序的)。这样做的目的是为了让指挥调度更加高效。

一旦调度了命令,命令文档其余部分或有效负载(包括查找情况下的查找条件)中的键顺序就无关紧要了。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>