go中bson的基本操作,bson.M,bson.D,bson.A,bson.E

2023-10-09 11:28
文章标签 go 基本操作 bson

本文主要是介绍go中bson的基本操作,bson.M,bson.D,bson.A,bson.E,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Bson的类型

bson对象是键值对对象,bson是JSON的二进制格式。go操作mongoDB数据库的时候经常使用bson键值对作为筛选条件。

D家族,可以简单的构建BSON对象。

D:一个BSON文档,这种类型应该在顺序重要的情况下使用。 每一对键值对都包含一个大括号,bson.D{{key,value},{key,value}},中间用逗号连接key,value。

M:一个无序的map,它和D是一样的,只是它不保持顺序。 每一对键值对不使用大括号,bson.M{key:value},中间用 冒号key:value 进行连接。

A:一个BSON数组,当使用“$and”,“$or”等要使用数组。

E:D里面的一个元素。

package bson // import "go.mongodb.org/mongo-driver/bson"import ("go.mongodb.org/mongo-driver/bson/primitive"
)
// 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.// Example usage:
//	bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}
type D = primitive.D// E represents a BSON element for a D. It is usually used inside a D.
type E = primitive.E// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not
// Example usage:
//
//	bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}
type M = primitive.M// An A is an ordered representation of a BSON array.
// Example usage:
//	bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}
type A = primitive.A

(1)bson.D

bson.D是一种有序的键值对,D(Document)格式代表了一个BSON文档。D包含了一个E切片,

type D []E

每一对键值对都需要用大括号来连接,bson.D{{key,value},{key,value}...},键和值之间使用逗号连接,比如:

bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}

(2)bson.E

bson.D有序键值对的其中一个元素。一个bson.D由多个bson.E构成。

// E represents a BSON element for a D. It is usually used inside a D.
type E struct {Key   stringValue interface{}
}bson.D{bson.E{Key: "name", Value: "zhangsan"},bson.E{Key: "age", Value: 19},
}

(3)bson.M

bson.M是无序的键值对,键值对之间使用冒号连接,比如:

bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}

(4)bson.A

bson.A是一个bson数组,当使用“$and”,等等,会使用数组。比如:

a := bson.A{"bar","cars",bson.M{"name": "zhangsan","age":  18,},bson.E{Key:   "address",Value: "China",},bson.D{{"cinder", "kingsoft"},{"glance", "kingsoft"},},}

bson.D和bson.M区别

①bson.D是有序的,bson.M是无序的。

②bson.D的键值对需要大括号括起来,bson.M不需要

③bson.M键值对使用:链接,bson.D键值对使用逗号,连接

2.举例

func bsonTestM() {docs := bson.M{"name": "Alice","age":  18,// addr是一个无序的键值对"addr": bson.M{"city":    "beijing","country": "China",},}// 序列化字节数组 func Marshal(val interface{}) ([]byte, error) {data, err := bson.Marshal(docs)if err != nil {panic(err)}fmt.Println("输出序列化的data内容:", data)var result bson.M// 方便将字节[]byte映射到结果集中。err = bson.Unmarshal(data, &result)if err != nil {panic(err)}fmt.Println("输出反序列化后的内容:", result)fmt.Printf("bson.M类型为%T", bson.M{})
}// 有序的键值对对象
func bsonTestD() {docs := bson.D{{"name", "zhangsan"},{"age", 18},}bytes, err := bson.Marshal(docs)if err != nil {panic(err)}var result bson.D// 为什么使用&result// 因为Unmarshal函数需要修改目标对象的值,而不仅仅是复制数据。通过传递指针,函数可以直接在目标对象的内存地址上进行操作,// 从而避免了对整个对象进行复制,节省了内存和处理时间。//另外,通过传递指针,可以确保Unmarshal函数可以正确地更新目标对象的值,而不是创建一个新的对象。/*总之,&result,其实就是为了可以直接在目标对象的内存地址进行操作,避免对整个对象的复制,节省了内存和处理时间。*/err = bson.Unmarshal(bytes, &result)if err != nil {panic(err)}fmt.Println(result)
}func testBsonA() {a := bson.A{"bar","cars",bson.M{"name": "zhangsan","age":  18,},bson.E{Key:   "address",Value: "China",},bson.D{{"cinder", "cinder"},{"glance", "demo"},},}fmt.Println(a)
}

其实用的比较多的是在go操作mongoDB的时候,因为mongoDB是键值对的数据库,bson文档可以作为filter过滤条件,这个用的多一些。

这篇关于go中bson的基本操作,bson.M,bson.D,bson.A,bson.E的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/172512

相关文章

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ