MongoDB的go SDK使用集锦

server/2024/9/20 15:43:55/

在上一章解读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.ppmy.cn/server/2781.html

相关文章

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升,许多编程语言也纷纷效仿,Java 也不例外。 另一边,尽管社区内部问题重重,但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的:Rust 的编译器让开发人员避免了各种问题。编译器对…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

设计模式系列:适配器模式

简介 适配器模式(Adapter Pattern)又称为变压器模式,它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。 适配器模式有两种…

论软件系统的架构风格,使用三段论 写一篇系统架构师论文

软件系统的架构风格是指在软件系统设计与开发过程中,采用的一组相互协调的设计原则、模式和实践。这些风格不仅影响着系统的技术实现,还关乎到系统的可维护性、可扩展性和可靠性等关键质量属性。通过三段论的结构,本文旨在探讨软件系统架构风…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…

【Web】Dest0g3 520迎新赛 题解(全)

目录 phpdest EasyPHP SimpleRCE funny_upload EasySSTI middle PharPOP ezip NodeSoEasy Really Easy SQL&easysql EzSerial ljctr phpdest 尝试打pearcmd,但似乎没有写文件的权限 ?config-create/&file/usr/local/lib/php/pearcmd.php&a…

windows本地运行dreamtalk踩坑总结

dreamtalk是一个语音图片转视频的一个工具,就是给一段语音加一个头像图片,然后生成一段头像跟语音对口型的视频,其实还是很有意思的,最近阿里发布了一个类似的模型,但是还没开源,从展示视频看,阿…

2024mathorcup数学建模A题思路

整体来说这个题就两个步骤,第一是训练一个响应面模型,输入是附表1中两个小区的PCI值,输出是附表2和附表3中的冲突、混淆和干扰的MR数值,需要训练3个响应面模型,这里就直接用所有小区的来做,也方便三四问&am…