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标签即可。

相关推荐
luckys.one3 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。5 小时前
Django中的软删除
数据库·django·sqlite
是誰萆微了承諾6 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
阿里嘎多哈基米6 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码6 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang7 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun7 小时前
Redis
数据库·redis·缓存
一成码农7 小时前
MySQL问题7
数据库·mysql
吃饭最爱7 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver
专注API从业者7 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python