当前位置: 首页 > news >正文

【Go - mongodb - bson / schema】

Bson是什么

bson 是 MongoDB 使用的一种二进制编码格式,全称为 Binary JSON。它用于存储和传输 JSON 风格的文档数据。bson 提供了一种高效的方式来表示 JSON 数据,同时支持更多的数据类型,例如日期和二进制数据。

在 Go 语言中,bson 是由 MongoDB 官方驱动包 go.mongodb.org/mongo-driver/bson 提供的一个包,用于处理 BSON 数据。这个包提供了多种类型和函数来编码和解码 BSON 数据。

Bson常用类型与示例

  • bson.D:有序的 BSON 文档,适用于需要保持字段顺序的场景。
  • bson.M:无序的 BSON 文档,适用于不需要保持字段顺序的场景。
  • bson.A:BSON 数组,适用于表示数组的场景。
  • bson.E:键值对,常用于构建 bson.D

以下是一个包含bson.D,bson.M,bson.A,bson.E的示例

package mainimport ("context""fmt""log""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func main() {// 连接到 MongoDBclient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))if err != nil {log.Fatal(err)}defer client.Disconnect(context.TODO())// 选择数据库和集合collection := client.Database("testdb").Collection("users")// 使用 bson.D 构建查询filterD := bson.D{{Key: "name", Value: "John"},{Key: "age", Value: bson.D{{Key: "$gt", Value: 25},}},}// 使用 bson.M 构建查询filterM := bson.M{"name": "John","age": bson.M{"$gt": 25,},}// 使用 bson.D 构建查询,包含 bson.E 和 bson.AfilterA := bson.D{{Key: "name", Value: "John"},{Key: "tags", Value: bson.A{"developer", "golang"}},}// 查询数据var resultsD []bson.Mvar resultsM []bson.Mvar resultsA []bson.Mctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)defer cancel()// bsonDcursorD, err := collection.Find(ctx, filterD)if err != nil {log.Fatal(err)}defer cursorD.Close(ctx)// bsonMcursorM, err := collection.Find(ctx, filterM)if err != nil {log.Fatal(err)}defer cursorM.Close(ctx)// bsonE// bsonAcursorA, err := collection.Find(ctx, filterA)defer cursorA.Close(ctx)if err = cursorD.All(ctx, &resultsD); err != nil {log.Fatal(err)}if err = cursorM.All(ctx, &resultsM); err != nil {log.Fatal(err)}if err = cursorA.All(ctx, &resultsA); err != nil {log.Fatal(err)}// 打印结果fmt.Println("Results using bson.D:", resultsD)fmt.Println("Results using bson.M:", resultsM)fmt.Println("Results using bson.D with bson.A:", resultsA)
}

如何定义表结构schema

虽然MongoDB 是no-sql类型,但在使用的时候,表结构一般是固定的,且在代码中为了更清晰的展示表结构 以及 其字段。所以一般都是 定义声明其schema,以下是个示例,

package mainimport ("context""fmt""log""sync""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)// User 表结构定义
type User struct {// 使用omitempty来表示某些字段是可选的ID    primitive.ObjectID `bson:"_id,omitempty"`Name  string             `bson:"name"`Age   int                `bson:"age"`Email string             `bson:"email,omitempty"`
}// 获取MongoDB客户端的单例
var singlestonMongoClient *mongo.Client
var once sync.Oncefunc getSinglestonMongoClient() *mongo.Client {once.Do(func() {uri := "mongodb://localhost:27017"client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))if err != nil {panic(err)}singlestonMongoClient = client})return singlestonMongoClient
}func main() {client := getSinglestonMongoClient()if client == nil {panic("client is nil")}defer func() {if err := client.Disconnect(context.TODO()); err != nil {panic(err)}}()// 选择数据库和集合collection := client.Database("testdb").Collection("users")// 查询用户数据var users []Userctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)defer cancel()cursor, err := collection.Find(ctx, bson.M{})if err != nil {log.Fatal(err)}defer cursor.Close(ctx)// 遍历数据for cursor.Next(ctx) {var user Userif err := cursor.Decode(&user); err != nil {log.Fatal(err)}users = append(users, user)}if err := cursor.Err(); err != nil {log.Fatal(err)}// 打印用户数据for _, user := range users {fmt.Printf("User: %+v\n", user)}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mcasttest-tool组播检测工具
  • linux shell(中)
  • Flink中三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式提交任务命令
  • XML 和 SimpleXML 入门教程
  • 某视频平台关键 so vm 解释器还原
  • 解析大数据分析行业的现状与前景:全球视角下的中国力量
  • Windows 环境 batch 脚本实现 PG 数据库恢复功能
  • 从代码层面熟悉UniAD,开始学习了解端到端整体架构
  • 【软件测试】--接口测试
  • WordPress主题追格企业官网主题免费开源版V1.1.6
  • 【剑指offer】
  • Swift学习入门,新手小白看过来
  • package:mine android studio新过滤规则及其用法 Filter使用技巧
  • 【AI大模型】-- 应用部署
  • 经典文献阅读之--World Models for Autonomous Driving(自动驾驶的世界模型:综述)
  • Android Studio:GIT提交项目到远程仓库
  • HTTP 简介
  • Java 网络编程(2):UDP 的使用
  • JavaScript设计模式之工厂模式
  • Netty源码解析1-Buffer
  • Puppeteer:浏览器控制器
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 从零开始的无人驾驶 1
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 简单数学运算程序(不定期更新)
  • 聚簇索引和非聚簇索引
  • 前端攻城师
  • 前言-如何学习区块链
  • 如何设计一个微型分布式架构?
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用element的upload组件实现多图片上传和压缩
  • 你对linux中grep命令知道多少?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​什么是bug?bug的源头在哪里?
  • ​业务双活的数据切换思路设计(下)
  • #162 (Div. 2)
  • (LLM) 很笨
  • (第61天)多租户架构(CDB/PDB)
  • (二十三)Flask之高频面试点
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四)鸿鹄云架构一服务注册中心
  • (转) 深度模型优化性能 调参
  • (转)memcache、redis缓存
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .CSS-hover 的解释
  • .form文件_一篇文章学会文件上传
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 给NuGet包添加Readme
  • .NET 设计一套高性能的弱事件机制
  • .NET8使用VS2022打包Docker镜像
  • .net操作Excel出错解决
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net开发引用程序集提示没有强名称的解决办法
  • @RequestBody详解:用于获取请求体中的Json格式参数