Go操作mongo
mongo自行安装
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
const mongo_uri = "mongodb://192.168.252.128:27017/?maxPollSize=20&w=majority&connectTimeoutMS=1000"
var (
mongc *mongo.Client
err error
)
type Student struct {
Id primitive.ObjectID `bson:"_id,omitempty"`
Name string
Age uint8
Address string
}
func init() {
opts := options.Client().ApplyURI(mongo_uri) // 返回一个客户端配置选项类型
mongc, err = mongo.Connect(context.TODO(), opts)
if err != nil {
log.Fatal(err)
}
err = mongc.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
}
func main() {
defer func() {
if err = mongc.Disconnect(context.TODO()); err != nil {
log.Fatal(err)
}
}()
u0 := mongc.Database("gopher").Collection("students")
// 单条插入
//s0 := Student{Name: "jerry", Age: 13, Address: "美国纽约"}
//result, err := u0.InsertOne(context.Background(), s0)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(result) //&{ObjectID("660d2407c7d50518621a9dd0")}
// 多条插入
//s1 := []interface{}{
// Student{Name: "lily", Age: 23, Address: "西班牙"},
// Student{Name: "hellen", Age: 22},
// Student{Name: "lucy", Address: "德国慕尼黑"},
//}
//
//result, err := u0.InsertMany(context.Background(), s1)
////if err != nil {
//// fmt.Println(err)
////}
//fmt.Println(result) //&{[ObjectID("660d24378fad8f01bb6c9e24") ObjectID("660d24378fad8f01bb6c9e25") ObjectID("660d24378fad8f01bb6c9e26")]}
//BSON
//https://www.mongodb.com/docs/drivers/go/current/fundamentals/bson/
//MongoDB的Go库提供的构建BSON的数据类型分为4种
//D : An ordered representation of a BSON document (slice),表示有序的,切片且元素是二元的
//M : An unordered representation of a BSON document (map),表示无序的,map且元素是kv 对
//A : An ordered representation of a BSON array
//E : A single element inside a D type
//查询
//bson.D{{"name", "tom"}}
//bson.D是切片,D后的{}表示切片字面量定义
//{"name", "tom"}表示一个结构体实例字面量定义, "name"是结构体的Key属性,类型是string, "tom"是结构体的Value属性,类型是any
//bson.M{"name": "tom"}
//bson.M是map,M后的{}表示该map的字面量定义
//map类型为map[string]interface{}
// 查询条件,利用bson来构建,bson.D是类型
//查询一个
//var r Student
//err = u0.FindOne(context.Background(), bson.D{{"name":"alice"}}).Decode(&r)
//if err != nil {
// // 查无此文档错误类型判断
// if err == mongo.ErrNoDocuments {
// return
// }
// fmt.Println(err)
//}
//fmt.Println("@@@", r) //@@@ {ObjectID("660d2407c7d50518621a9dd0") jerry 13 美国纽约}
//查询多个
//filtd := bson.D{{"name", "tom"}}
//cursor, err := u0.Find(context.Background(), filtd)
//if err != nil {
// log.Fatal(err)
//}
//var s0 []Student
//err = cursor.All(context.Background(), &s0)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Println(s0)
// 修改
//update := bson.D{
// {"$set", bson.D{
// {"age", 31},
// }},
//}
//多条件查询
//多条查询,条件前用$,gt/lt/eq/ne/gte/lte,多个条件为and关系
// filtm := bson.D{{"age", bson.M{"$gt": 20}}}
// filtm := bson.M{"age": bson.D{{"$ne", 23}}}
// in和notin逻辑
// filtm := bson.M{"name": bson.M{"$in": []string{"tom", "lily"}}}
// filtm := bson.D{{"name", bson.D{{"$nin", []string{"lucy", "hellen"}}}}}
// and、or逻辑,注意array类型
// filtm := bson.D{{"$or", []bson.M{{"name": "tom"}, {"age": bson.M{"$gt": 20}}}}}
// 查询时,字段的类型与值要对应,如果下面的age的值29为string,将查找为空
// filtm := bson.M{"$and": []bson.M{{"name": "tom"}, {"age": 29}}}
// not逻辑,写法有点绕
//filtm := bson.M{"name": bson.M{"$not": bson.M{"$eq": "tom"}}}
//cursor, err := u0.Find(context.Background(), filtm)
//if err != nil {
// log.Fatal(err)
//}
//// 关闭游标
//defer cursor.Close(context.Background())
//var s0 []Student
//err = cursor.All(context.Background(), &s0)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Println(s0)
//更新单个
//res, err := u0.UpdateOne(context.Background(), filter, update)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Println(res)
//更新多个
// updateOne(filter, update)
//filter := bson.M{"name": "lucy"}
//// $inc自增减配置
//update := bson.M{"$set": bson.M{"address": "上海"}, "$inc": bson.M{"age": -3}}
//r, err := u0.UpdateMany(context.Background(), filter, update)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Printf("匹配到%v条; 更新了%v条\n", r.MatchedCount, r.ModifiedCount)
//// 删除
//filter := bson.D{{"name", "jerry"}}
//res, err := u0.DeleteOne(context.Background(), filter)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Println(res)
//删除多个
//filter := bson.M{} // 没有条件,匹配所有文档
//dr, err := u0.DeleteMany(context.TODO(), filter)
//if err != nil {
// log.Fatal(err)
//}
//fmt.Println(dr.DeletedCount)
//排序
// limit+投影,true、1为-1、false相反
//SetProjection 设置要返回的字段
opts := options.Find().SetLimit(3).SetSkip(0).SetProjection(bson.M{"name": 1, "age": 1})
// 排序,1为升序,-1为降序,其他报错
opts.SetSort(bson.M{"age": -1})
filter := bson.M{"age": bson.M{"$gt": 0}}
cursor, err := u0.Find(context.TODO(), filter, opts)
if err != nil {
log.Fatal(err)
}
var s0 Student
defer cursor.Close(context.TODO())
for cursor.Next(context.TODO()) {
err = cursor.Decode(&s0)
if err != nil {
log.Fatal(err)
}
fmt.Println(s0)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通