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   string
	Value 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过滤条件,这个用的多一些。

欢迎关注公众号:天天说编程

你的关注是我最大的动力!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话意思是,'document'必须是一个字典实例,bson.son.son,bson.raw_bson.rawbsondocument,或者是继承自collections.mutablemapping的类型。 ### 回答2: 这个错误提示是在使用Python编程语言的时候可能会出现的一种错误。它意味着某个函数或方法的参数要求传递一个特定类型的对象,而传递进去的对象类型不符合要求。 具体来说,这个错误提示是因为要求传递的参数是字典类型、bson.son.son类型、bson.raw_bson.rawbsondocument类型或者继承自collections.mutablemapping类型的对象。如果传递的对象不符合这些类型要求,就会出现这个错误。 为了解决这个错误,我们可以通过以下几个步骤来进行排查和处理: 1. 检查传递的对象类型:首先要确保传递的对象类型是字典类型、bson.son.son类型、bson.raw_bson.rawbsondocument类型或者继承自collections.mutablemapping类型的对象。可以通过type()函数来查看对象的类型。 2. 查看函数或方法的参数要求:仔细阅读错误提示,确定具体是哪个函数或方法的参数要求出现了问题。然后仔细查阅相关文档或代码,了解应该传递哪种类型的对象作为参数。 3. 检查对象的来源和实例化过程:如果对象是通过代码创建的,检查创建对象的代码逻辑和实例化过程,确保创建的对象类型正确。如果对象是从外部获取的,可以检查数据来源是否正确以及数据获取的逻辑是否正确。 4. 进行类型转换:如果确定传递的对象不符合要求,可以尝试进行类型转换。例如,如果传递的对象是一个集合类型,可以尝试将其转换为字典类型。可以使用相关的类型转换函数或方法进行类型转换操作。 总之,解决这个错误需要我们仔细检查代码并弄清楚错误发生的原因。通过对错误提示信息的理解和相关的排查步骤,可以逐步解决这个问题。 ### 回答3: 文档必须是dict、bson.son.son、bson.raw_bson.rawbsondocument的实例,或者是继承自collections.mutablemapping的类型。 文档通常是用来存储和组织数据的一种方式。在某些编程环境,操作和处理文档数据是非常常见的任务。然而,在进行这些操作和处理之前,我们必须确保文档的类型满足一定的要求。 首先,文档必须是字典(dict)类型的实例。字典是一种无序的数据结构,它由键值对(key-value pairs)组成。这意味着我们可以通过键来访问和操作文档的值。使用字典类型的文档,我们可以更方便地对数据进行增、删、改、查等操作。 其次,文档还可以是bson.son.son的实例。bson是一种二进制的数据序列化格式,它可以将数据转换为二进制的形式进行存储和传输。bson.son.son是一个特殊的类型,它表示了一个bson文档的抽象表示形式。因此,如果我们需要进行与bson相关的操作,我们可以使用bson.son.son类型的文档。 另外,文档还可以是bson.raw_bson.rawbsondocument的实例。和bson.son.son类似,bson.raw_bson.rawbsondocument也是一个用于存储和处理bson文档的类型。它提供了更底层的接口,允许我们直接访问和操作原始的bson二进制数据。 最后,文档还可以继承自collections.mutablemapping,这是一个Python标准库的类型。该类型提供了一些用于处理可变映射(mapping)数据结构的方法和属性。继承自该类型的文档可以充分利用Python提供的映射操作,使数据的处理更加便捷和高效。 总结起来,为了保证文档在操作和处理的兼容性和合法性,我们必须确保它是dict、bson.son.son、bson.raw_bson.rawbsondocument的实例,或者是继承自collections.mutablemapping的类型。只有满足这些要求,我们才能顺利进行相关的操作和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值