如何解决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服务器足够聪明,可以找到匹配的索引,而不管使用的顺序如何。例如。如果您有一个包含字段A
和B
的复合索引,则首先使用bson.D
筛选器列表B
,然后A
不会阻止服务器使用现有的指数。因此,在这种情况下,您可以使用bson.M
和bson.D
,没关系。
例如,当您指定排序字段时,顺序就很重要。如果先按字段A
然后按字段B
进行排序,则与先按B
然后按A
进行排序的顺序可能完全不同。因此,当您指定具有多个字段的排序文档时,绝对应该使用bson.D
。
例如,在插入新文档时,顺序也可能很重要。如果您将bson.M
用作文档,则不能保证字段顺序在所有文档中都相同。当您使用bson.D
时,在您列出bson.D
中的字段时,保存的文档中的顺序将与该顺序匹配。
键顺序适用于有线协议,不适用于查询执行。
在MongoDB中,BSON文档是键-值对的有序列表。
BSON用于序列化存储在集合中的文档以及“命令文档”,这是发送到服务器的命令。
服务器处理命令时,它要求命令名称是第一个键(记住键是有序的)。这样做的目的是使命令调度更有效。
一旦分派了命令,命令文档其余部分或有效负载(包括find情况下的find条件)中的键顺序就无关紧要了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。