MongoDB的go SDK使用集锦

在上一章解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用介绍了如何使用mongo shell操作mongo数据库,接下来介绍如何使用sdk来操作数据库,这里以go语言为例,其他语言请查看源文档mongo docs

在这里插入图片描述
Quick Start

  • 内置数据结构

MongoDB是存储JSON数据结构的数据库,但是json在mongo的存储格式却是二进制形式存储。和程序的数据结构一样这个二进制不经包含了数据的结构也包含了数据类型,被称作BSON(二进制编码的JSON)。

mongo的go driver中提供了内置的解析数据的数据结构分别为:

在这里插入图片描述

D:BSON的有序document切片表示

M:BSON的哈希表表示map结构

A:BSON数组

E:D类型的一个单元素

bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}
bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}
bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}

这些内置的数据结构既可以做参数又可以做返回值。

  • 客户端

go get go.mongodb.org/mongo-driver/mongo

package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func main() {// 创建客户端c, err := mongo.Connect(context.Background(), options.Client().ApplyURI("mongodb://localhost:32768"))if err != nil {log.Println("CONNECT ERR", err)return}// 绑定collecttion collecttion := c.Database("test").Collection("inventory")var result bson.Merr2 := collecttion.FindOne(context.Background(), bson.D{{"qty", 100}, {}}).Decode(&result)if err2 != nil {log.Println("COLL ERR", err2)return}fmt.Println(result)}
  • 内置数据结构的CURD

coll := c.Database("test").Collection("inventory")

查找

// 单个查询
var result bson.D
err = coll.FindOne(context.TODO(), bson.D{{"firstName", Mike}}).Decode(&result)// 多个查询
cursor, err := coll.Find(context.TODO(), bson.D{{"age", bson.D{{"$gte", 46}}}})

添加

// 单个添加
result, err := coll.InsertOne(context.TODO(),bson.D{{"animal", "Dog"},{"breed", "Beagle"}}
)// 批量添加
docs := []interface{} {bson.D{{"firstName", "Erik"}, {"age", 27}},bson.D{{"firstName", "Mohammad"}, {"lastName", "Ahmad"}, {"age", 10}},bson.D{{"firstName", "Todd"}},bson.D{{"firstName", "Juan"}, {"lastName", "Pablo"}}}result, err := coll.InsertMany(context.TODO(), docs)

修改

// 单个修改
result, err := coll.UpdateOne(context.TODO(),bson.D{{"firstName", "Erik"}},bson.D{{"$set", bson.D{{"age", 28}}}}
)// 批量修改
result, err := coll.UpdateMany(context.TODO(),bson.D{{"age", bson.D{{"$gte", 58}}}},bson.D{{"$set", bson.D{{"description", "Senior"}}}}
)
fmt.Printf("The number of modified documents: %d\n", result.ModifiedCount)

删除

// 单个删除
result, err := coll.DeleteOne(context.TODO(),bson.D{{"firstName", "Xiao"}}
)// 批量删除
results, err := coll.DeleteMany(context.TODO(),bson.D{{"age", bson.D{{"$lte", 12}}}}
)
  • 结构体变量

在go语言中使用最多的是结构体,因此无需使用内置数据结构。


// 选择要插入数据的集合
collection := client.Database("test").Collection("users")// 创建要插入的数据结构体
user := User{Name:  "Alice",Email: "alice@example.com",Age:   25,
}// 将数据结构体转换为 BSON 格式
userBSON, err := bson.Marshal(user)
if err != nil {panic(err)
}// 插入数据
_, err = collection.InsertOne(context.Background(), userBSON)
if err != nil {panic(err)
}
type bih struct {Id   string   `bson:"_id"`Item string   `bson:"item"`Qty  int      `bson:"qty"`Size size     `bson:"size"`Tags []string `bson:"tags"`
}
type size struct {H   int     `bson:"h"`W   float32 `bson:"w"`Uom string  `bson:"uom"`
}collecttion := c.Database("test").Collection("inventory")
var tmp bih
err2 := collecttion.FindOne(context.Background(), bson.D{{"qty", 100}, {}}).Decode(&tmp)if err2 != nil {log.Println("COLL ERR", err2)return}
fmt.Println(tmp)

在这里插入图片描述

Json和结构体是一致的,只要使用bson标签即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623891.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于idea中mybatis插件,下载后,无法生成代码模板--解决方法

一、不用相信网上其他解决方法 1.1试过,无效 二、解决方法 2.1【注:多试几次】重新下载,并重新启动idea 三、操作方法 3.1步骤 3.2idea重启,【如果没有重启】手动重启,必须有,很重要 3.3重新下载mybat…

电商技术揭秘九:搜索引擎中的SEO数据分析与效果评估

相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台的个性…

【触想智能】如何选购到一款合适的工业电脑一体机

工业电脑一体机是专为工业环境而设计的一种工业计算机。工业电脑一体机和普通的计算机不一样,它对产品的参数性能要求很高,因为它们通常会运行在高低温、电磁干扰、高粉尘、湿度大的恶劣环境中,所以相应的要求工业电脑一体机必须具备良好的宽…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果,共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

记第一次踩坑Gradle

今天有个项目只能使用Gradle编译,没办法了,尝试吧。 先去下载了最新版本的Gradle,然后配置好了环境变量,可以在命令行使用gradle命令了。 然后打开项目开始操作一番,但是上来就傻眼了。 我白下载了,又重新下…

【火猫TV】NBA:赛季数据王总结,国王双雄爆冷入选

NBA常规赛已经全部结束,各项数据王诞生,我们发现不少新人球星开始挑大梁,他们用出色的发挥证明了自己的实力。下面,为大家简单盘点下各项数据的最佳球员! 得分王:东契奇(场均33.9分) 本赛季独行侠低开高走,东契奇保持了出色发挥,他场均贡献33.9分,比第二的字母哥场均多出3.5分…

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发(兼容232和485) 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

OSPF---综合实验

1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回,其他路由器均有一个环…

水牛社:打造你的居家副业利器,让赚钱变得更简单

水牛社,这个已经陪伴我们走过九个春秋的综合性网络任务和项目资源整合平台,真的给我留下了深刻的印象。它不仅仅是一个资源的汇聚地,更是一个帮助无数人实现网络副业梦想的平台。作为一个资深用户,我深感其中的价值和魅力。 水牛…

vs2008使用 openmp

目录 1 在项目中找到property pages>>c/c>>language>>openmp支持 2 在环境变量中增加“OMP_NUM_THREADS”变量,数值自己根据你的CPU的性能来设置,一般2、4、8等 3 在项目中输入如下代码,并编译运行 4 结果与不使用omp的…

全局视角观看Python备忘录-英文版

全局视角观看Python备忘录-英文版

FPGA - 以太网UDP通信(一)

一,简述以太网 以太网简介 ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网类型介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有…