bson.D 与 bson.M 用于查找查询

bson.D vs bson.M for find queries

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

使用 Find to query some data from a collection, we can use both the bson.M- and bson.D 类型指定此查找的过滤器时。

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

D is an ordered representation of a BSON document. This type should be used when the order of the elements matters, such as MongoDB command documents. If the order of the elements does not matter, an M should be used instead.

现在我的问题是,使用其中任何一种结构,即有序结构还是无序结构,是否会对 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 文档是 key-value 对的有序列表。

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

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

命令发出后,命令文档其余部分或有效载荷(包括查找情况下的查找条件)中的键顺序无关紧要。