在上一章解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用介绍了如何使用mongo shell操作mongo数据库,接下来介绍如何使用sdk来操作数据库,这里以go语言为例,其他语言请查看源文档mongo docs
- 内置数据结构
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
标签即可。