【Go - 什么有序?解密MongoDB bson.D】

在Go进行MongoDB的查询,插入等语句的运行时,总是会用到bson.D。

对于bson.D,官方文档中的解释是有序的,这也是其与bson.M的一大区别。但是这个有序的到底是指什么有序,检索时使用索引有序,还是插入时按顺序更新?其和bson.M的具体区别是什么。下面让我们来一探究竟,

基础用法

复制代码
bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}

典型用法

go 复制代码
filter := bson.D{{"foo", "bar"}, {"hello", "world"}}
var result bson.D
err = collection.FindOne(context.TODO(), filter).Decode(&result)

VS bson.M

复制代码
bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}

可以看出,对比bson.M 和 bson.D

  • bson.M是个map类型,典型的哈希形式。
  • bson.D传递的是一个数组。

源码

再看眼源码

复制代码
type D = primitive.D

package primitive 

type D []E

type E struct {
  Key   string
  Value interface{}
}

bson.D就是有序数组,里面可包含多个struct E,E由 Key 和 Value 构成。

到底是什么有序

那么至此,回到文题 bson.D的有序 ,是什么有序 ,什么时候有用,什么时候无用。

1. 什么时候用 bson.D

  • 排序字段 :当你指定排序字段时,字段的顺序非常重要。例如,按字段 A 排序然后按字段 B 排序,可能与先按字段 B 排序然后按字段 A 排序的结果完全不同。因此,当你指定一个包含多个字段的排序文档时,应该使用 bson.D。

    示例:

    go 复制代码
    sort := bson.D{
        {"age", 1},  // 先按年龄升序排序
        {"name", 1}, // 然后按名字升序排序
    }
  • 插入新文档 :当你插入一个新文档时,如果你希望所有文档中的字段顺序一致,应该使用 bson.D。使用 bson.M 时,字段的顺序不保证一致 ,而使用 bson.D 时,保存的文档中的字段顺序将与 bson.D 中列出的顺序匹配。

    示例:

    go 复制代码
    newDoc := bson.D{
        {"name", "Alice"},
        {"age", 25},
        {"location", "New York"},
    }

2. 什么时候不用 bson.D

  • 过滤条件:当你在构建 MongoDB 查询的过滤条件时,字段的顺序通常不重要。MongoDB 服务器足够智能,可以根据索引找到匹配的记录,无论字段的顺序如何。

    换句话说,MongoDB中使用联合索引检索的时候,不用多操心联合索引 ,多个查询索引的排列顺序,谁先放在前面 谁放在后面,MongoDB 内部有机制能保障 无论怎么排序,只要索引存在 都可以命中且内部有调优的,不用太多费心。

    因此,在这种情况下,可以使用 bson.M,可以更简短些。

示例:

go 复制代码
filter := bson.M{
    "name": "Alice",
    "age": 25,
}

总结:

  • 使用 bson.M:当字段顺序不重要时,例如 筛选条件
  • 使用 bson.D:当字段顺序重要时,例如 排序字段,插入新文档
相关推荐
其实防守也摸鱼1 小时前
Codex 下载与本地部署实战指南
linux·服务器·前端·数据库·算法·ai
Lost of 程序猿1 小时前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
X北辰北1 小时前
C++ 进阶第二阶段总结|STL容器全家桶、迭代器失效、STL算法、序列化入门(工程必备)
开发语言·c++·算法
知守观1 小时前
Maven SNAPSHOT 更新排查:-U 无效、clean 无用,问题在 _remote.repositories(附完整链路)
java·后端·maven
苏渡苇1 小时前
从零搭建 Vue 3 工程化项目:Vite + TypeScript + Pinia + Element Plus 实战
前端·vue.js·typescript
CallFay云起未来1 小时前
2026年AI客服能不能减少人工回复?从知识检索到人机协同的技术实现
java·大数据·前端·人工智能·架构·文心一言
IT_陈寒2 小时前
一文搞懂SpringBoot的核心概念
前端·人工智能·后端
伯恩bourne2 小时前
对比 @Configuration(Full) vs @Component(Lite)
java·开发语言
软件开发技术深度爱好者2 小时前
ndexTTS-2和 CosyVoice之TTS(Text-to-Speech)使用python示例
开发语言·python