首页 > 数据库 > go操作mongodb

go操作mongodb

时间:2023-08-28 11:45:05浏览次数:34  
标签:err mongodb fmt Println context go 操作 TODO

目录

go操作mongodb

依赖

go get go.mongodb.org/mongo-driver/mongo

实例

package daily

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var (
	MongoClient *mongo.Client
)


/*
*
go mongodb
1. 下载依赖:go get go.mongodb.org/mongo-driver/mongo
2. 参考文档: https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo
*/
func initMongoDB() error {
	var err error
	uri := "mongodb://localhost:27017"
	//uri := "mongodb://username:password@localhost:27017"
	clientOptions := options.Client().ApplyURI(uri)             // 客户端配置
	client, err := mongo.Connect(context.TODO(), clientOptions) // 建立连接
	if err != nil {
		return err
	}
	if err = client.Ping(context.TODO(), nil); err != nil { // 连接是否可用
		return err
	}
	MongoClient = client
	return err
}

func MongodbOp() {
	/**
	mongodb操作
	1. 下载依赖: go get go.mongodb.org/mongo-driver/mongo
	PS:
		context上下文扩展阅读
		https://juejin.cn/post/7233981178101186619
	*/
	type myUser struct {
		Name string `bson:"Name"`
		Age  uint   `bson:"Age"`
    } // 字段需要大写(重要)
	// 1. 初始化
	err := initMongoDB()
	if err != nil {
		fmt.Println("mongoDB连接失败=" + err.Error())
		return
	} else {
		fmt.Println("mongoDB连接成功")
	}

	// 2.1 单个新增
	collection := MongoClient.Database("go_db").Collection("user")
	ms := myUser{Name: "xyz", Age: 10}
	one, err := collection.InsertOne(context.TODO(), ms)
	//one, err := collection.InsertOne(context.TODO(), bson.M{"a": 1})
	if err != nil {
		fmt.Println("单个新增失败=" + err.Error())
		return
	}
	fmt.Println("单个新增成功id=", one.InsertedID)

	// 2. 批量新增
	msl := []interface{}{
		myUser{Name: "x1", Age: 11},
		myUser{Name: "x2", Age: 12},
	}
	many, err := collection.InsertMany(context.TODO(), msl)
	if err != nil {
		fmt.Println("批量插入失败=", err.Error())
		return
	}
	fmt.Println("批量插入成功=", many.InsertedIDs, len(many.InsertedIDs))

	// 3. 查询
	//var u myUser
	//findOne := collection.FindOne(context.TODO(), bson.D{}).Decode(&u) // 查询一个
	findOptions := options.Find()
	findOptions.SetLimit(2) // 可选-只输出2个
	cur, err := collection.Find(context.TODO(), bson.D{}, findOptions)
	if err != nil {
		fmt.Println("查询异常-获取游标失败=" + err.Error())
		return
	}
	defer cur.Close(context.TODO())
	defer MongoClient.Disconnect(context.TODO())
	for cur.Next(context.TODO()) {
		var result bson.D
		if err := cur.Decode(&result); err != nil {
			fmt.Println("cur.Decode异常=" + err.Error())
			return
		}
		fmt.Println("查询结果=", result)
	}
	// 4. 更新
	updateOne, err := collection.UpdateOne(context.TODO(), bson.D{{"Name", "x1"}}, bson.D{{"$inc", bson.D{{"Age", 1}}}})
	if err != nil {
		fmt.Println("单个更新失败=" + err.Error())
		return
	}
	fmt.Println("单个更新成功=", updateOne.MatchedCount, updateOne.ModifiedCount)
	updateMany, err := collection.UpdateMany(context.TODO(), bson.D{{"Name", "x2"}}, bson.D{{"$set", bson.D{{"Age", uint(31)}}}}) // 修改多个  age加1
	if err != nil {
		fmt.Println("批量更新失败=" + err.Error())
		return
	}
	fmt.Println("批量更新成功=", updateMany.MatchedCount, updateMany.ModifiedCount)
	// 5.删除
	//err = collection.Drop(context.TODO()) // 删除整个集合(数据表)
	//if err != nil{
	//	fmt.Println("删除整个集合失败=" + err.Error())
	//	return
	//}else {
	//	fmt.Println("删除整个集合成功")
	//}
	deleteOne, err := collection.DeleteOne(context.TODO(), bson.D{{"Name", "x2"}})
	if err != nil {
		fmt.Println("单条删除失败=" + err.Error())
		return
	} else {
		fmt.Println("单条删除成功=", deleteOne.DeletedCount)
	}
	deleteMany, err := collection.DeleteMany(context.TODO(), bson.D{{"Name", "x2"}})
	if err != nil {
		fmt.Println("批量删除失败=" + err.Error())
		return
	} else {
		fmt.Println("批量删除成功=", deleteMany.DeletedCount)
	}
}


标签:err,mongodb,fmt,Println,context,go,操作,TODO
From: https://www.cnblogs.com/fsh19991001/p/17661899.html

相关文章

  • 实用指令_实操作_任务调度基本说明
    crond任务调度任务调度:是指系统在某个时间执行的特定的命令或者程序任务调度分了:1.系统工作:有些重要的工作必须周而复始的执行,如病毒扫描等;2个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。基本语法crontab{选项}常用选项选项描述-e......
  • VMware虚拟机ubuntu和主操作系统硬盘之间的文件共享的实现
    安装vmware-tools就能实现文件共享 1.在虚拟机种加载linux.iso文件。Settings-Hardware-CD/DVD(IDE)-Useisoimagefile中加入linux.iso文件。PS:这个文件可以在VMware的安装目录下找到:\ProgramFiles\VMware\VMwareWorkstation\linux.iso 2.启动虚拟机进入/mnt/cdrom目录cd/......
  • google Map经纬度坐标取得方法
        谷歌地图(交通地图)上并没有显示某个地址的经纬度,实际上,我们已经想到了一个办法,可以找到在谷歌地图上任意地点的经度和纬度。 首先打开Google地图,在上面寻找一个地址,然后上下左右移动地图,让这个地址正好处于地图的正中心位置,当您想寻找坐标位置已经处于地图的中心位......
  • Maven plugin中的lifecycle、phase、goal、mojo概念及作用的理解
       首先,说些题外话,maven的plugin真的很容易写,很多时候,我们只是被plugin这个词吓倒了,总以为插件这玩意,是专家才能写的,我maven都没精通,怎么写得出自己的plugin呢,其实不然,起码在maven中,写一个自己的plugin还是非常简单的,其它软件的插件,要看情况,有些的确是要天才级人物才写得出,......
  • Django开启事务
    目录开启事务1django中实现事务的几种方式2事物的回滚和保存点3事务提交后,执行某个回调函数开启事务1django中实现事务的几种方式#1全局开启事务--->全局开启事务,绑定的是http请求响应整个过程DATABASES={'default':{#全局开启事务,绑......
  • PostMan上传附件操作步骤
    PostMan上传附件操作步骤1.Head配置接口token环境配置过于简单不做详述-------(不会可百度)2.Head配置Content-Type设置Content-Type,我这里设置为form-data一般后面会跟**boundary=----WebKitFormBoundary7TMYhSONfkAM2z3a**可省略,满足post方式发送浏览器会自动创......
  • Django信号、自定制命令、开启事务、执行原生SQL
    目录Django信号内置信号自定义信号执行原生SQL自定制命令步骤Django信号django自带一套信号机制来帮助我们在框架的不同位置之间传递信息。简单的说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(siganls)发送给一组接收者(receivers)。有内置信号(......
  • 粘贴板工具Ditto(存储粘贴板历史,可以使用快捷键调用,减少重复操作)相关配置
    官方地址:https://ditto-cp.sourceforge.io/一般下载便携版即zip压缩包的版本即可配置:1.更改界面语言右键-options-language-下拉选择Chinesesimple2.快捷键设置-点击"键盘快捷键"选项卡 激活使用默认的ctrl+`即可重点:最后十个项目的快捷键第一个可以不设,因为使......
  • 深入理解操作系统中进程与线程的区别及切换机制(上)
    进程所谓进程,大家可以理解为我们打开的应用程序,如微信、QQ、游戏等,但也有系统应用是我们看不见的,可以打开任务管理器一探究竟,我们写的代码程序在服务器上在不运行的情况下,它就是一个二进制文件,并不是进程!一个进程可以包含一个或者多个线程,但对于CPU来说他就是一个任务而已;在......
  • Prometheus on k8s 部署与实战操作进阶篇
    目录一、概述二、常见的几款监控工具1)kube-prometheus和kube-prometheus-stack区别2)PrometheusOperator和kube-prometheus或kube-prometheus-stack对比三、PrometheusOperator架构四、快速在k8s内搭建Prometheus全家桶1)k8s环境安装2)安装helm3)【第一种安装方法】直接......