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并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁