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)
	}
}

posted @   朝阳1  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示