首页 > 其他分享 >Go操作mongo

Go操作mongo

时间:2024-04-07 17:36:49浏览次数:14  
标签:mongo err nil log context Go 操作 bson name

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

标签:mongo,err,nil,log,context,Go,操作,bson,name
From: https://www.cnblogs.com/qcy-blog/p/18119509

相关文章

  • ZW3D二次开发_文件_操作用户属性
    1.什么是文件用户属性?文件用户属性是指用户保存在ZW3D文件内的自定义属性。如下图打开ZW3D文件用户属性界面可查看用户属性:2.如何使用代码操作文件用户属性?1)添加用户属性//添加用户属性 constintnumber=5; svxAttributeuserAttrs[number]={0}; strcpy......
  • Cargo
    Cargo是Rust语言的包管理器和构建工具。它可以帮助您管理依赖项、构建项目、运行测试和发布程序等。在Rust社区中,Cargo已经成为了标准的构建工具,它为Rust的开发者提供了极大的便利。Cargo的主要功能包括:管理依赖项:Cargo可以帮助您下载和安装Rust包,并将其添加到......
  • 操作系统综合题之“采用动态分区分配算法下的3种算法(首次适应算法、循环首次适应算法
    一、问题:当空闲链如下图,第一个空闲分区起始地址为20KB,大小为120KB;第二个空闲分区起始地址为200KB,大小为100KB;第三个空闲分区起始地址为400KB,大小为60KB。若某进程P1先申请大小为30KB的内存空间,随后进程P2再申请大小为20KB的内存空间,画出给P1分配完之后的空闲链和给P2分配完......
  • 一个邓白氏到底能申请几个Google Play开发者账号?
    随着Google play上架行业的发展,谷歌的审核系统越来越智能和全面,对开发者账号的管理规定也越来越严格。自 2023 年 8 月 31 日起,注册谷歌企业开发者账号时,需要提供企业邓白氏码才能提交注册申请。 邓白氏码是企业的标识符,全球范围内的公司可提供企业相关资料向 Dun &......
  • Go 项目依赖注入wire工具最佳实践介绍与使用
    目录一、引入二、控制反转与依赖注入三、为什么需要依赖注入工具3.1示例3.2依赖注入写法与非依赖注入写法四、wire工具介绍与安装4.1wire基本介绍4.2安装五、Wire的基本使用5.1前置代码准备5.2使用Wire工具生成代码六、Wire核心技术5.1抽象语法树分析5.2模板编程七......
  • 【Java业务需求解决方案】分布式锁应用详情,多种方案选择,轻松解决,手把手操作(非全数
    目录背景:解决方案:分布式锁方案一(不建议,但原理得懂):Redis锁setnx与业务代码处理雏形代码产生问题一:锁释放问题代码改造:锁添加过期时间产生问题二:锁被别的线程误删代码改造:添加setnx锁请求标识防勿删产生问题三:递归容易造成内存溢出代码改造:递归改造while循环产生......
  • Django单程序运行
    1、增加环境变量并且配置#确保运行在最model类之前importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','SmsProject.settings')django.setup()2、如果使用Pycharm还需要做如下配置3、运行程序importosimportdjangoos.environ.setdefault(......
  • 【Go高阶】细说 Channel 的进阶用法
    在Go语言中,channel是一种内置的数据结构,用于在不同的goroutine之间进行通信。它是一个非常强大的并发工具,可以实现各种并发模式和同步机制。以下是一些Go语言中channel的高级用法:1.BufferedChannels带缓冲的channel可以在没有接收者的情况下发送数据,数据会被存储在chan......
  • Golang context (上下文)是什么
    Golangcontext(上下文)是什么?原创 几颗酥 几颗酥 2024-03-1111:24 广西 1人听过介绍Context 是golang中十分重要的接口,用于定义 goroutine 中的上下文信息,context 常用于以下几种情况:数据传递:在多个 goroutine 中传递数据超时管理:通过配置超时时间,可以......
  • go | 上传文件分析 | http协议分析 | 使用openssl 实现 https 协议 server.key、serve
    是这样的,现在分析抓包数据test.gopackagemainimport( "fmt" "log" "github.com/gin-gonic/gin")funcmain(){ r:=gin.Default() //Uploadsinglefile r.MaxMultipartMemory=8<<20 r.POST("/upload",func(......