聊聊MongoDB BSON数据格式

前戏 小白:老花,最近我在研究MongoDB,听说它使用BSON作为数据格式,这BSON到底是个啥玩意儿? 老花:哈哈,小白,BSON是Binary JSON的缩写,它是一种类JSON的二进制编码格式。BSON的设计目的, 是为了在MongoDB中存储和交换文档数据。它继承了JSON的灵活性和可读性,同时增加了一些额外的数据类型,比如日期、二进制数据和代码等。 小白:那为啥要用BSON这种数据存储格式呢? 老花:有几个原因。首先,BSON是二进制格式,这意味着它比JSON更紧凑,传输效率更高。其次,BSON支持更多的数据类型,这使得它能够存储更复杂的数据结构。再者,BSON是自描述的,每个字段都有类型信息,这使得解析BSON数据时更加方便。 小白:听起来挺酷的,那我们怎么解析BSON数据呢? BSON 数据格式 解析BSON数据其实很简单。 在 Go 语言中,MongoDB的官方驱动提供了很好的支持。你可以使用go.mongodb.org/mongo-driver/bson这个包来处理BSON数据。 比如,你可以这样解析一个BSON文档: var doc bson.M err := bson.Unmarshal(data, &doc) if err != nil { log.Fatal(err) } fmt.Println(doc) 这里的data是你从 MongoDB 获取的 BSON 格式的字节切片,bson.M是一个可以存储任何类型值的 map,非常适合用来解析BSON文档。 如何实现 BSON 模糊搜索? 小白:那如果我想对 BSON 数据进行模糊搜索,比如搜索名字中包含某个字符串的文档? 老花:这个也好办。在 MongoDB 中,你可以使用正则表达式来进行模糊搜索。在 Go 语言中,你可以这样构建查询: import "go.mongodb.org/mongo-driver/bson" // 假设我们要搜索名字中包含"haha"的文档 filter := bson.M{"name": bson.M{"$regex": "haha", "$options": "i"}} // "i"代表忽略大小写 // 然后使用这个 filter 来查询数据库 cursor, err := collection.Find(context.TODO(), filter) if err != nil { log.Fatal(err) } // 遍历结果 for cursor.Next(context.TODO()) { var result bson.M err := cursor.Decode(&result) if err != nil { log.Fatal(err) } fmt.Println(result) 这段代码会查询所有 name 字段中包含haha的文档,并且忽略大小写。 在 MongoDB 中,除了$regex 算子用于模糊搜索外,还有一些其他的算子可以用于不同的搜索场景: ...

十二月 13, 2024 · 5 分钟 · 935 字 · zhu733756