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类型的一个单元素

json 复制代码
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

go 复制代码
package main

import (
	"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.M
	err2 := 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")

查找

go 复制代码
// 单个查询
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}}}})

添加

go 复制代码
// 单个添加
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)

修改

go 复制代码
// 单个修改
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)

删除

shell 复制代码
// 单个删除
result, err := coll.DeleteOne(
    context.TODO(),
    bson.D{{"firstName", "Xiao"}}
)

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

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

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)
}
go 复制代码
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标签即可。

相关推荐
天桥下的卖艺者2 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
隔窗听雨眠2 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
数据库小学妹2 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
Achou.Wang3 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
神龙天舞20013 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈5 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a5 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事6 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四6 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA6 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库