Go实现mongodb增删改查工具类的代码示例

 更新时间:2023年10月13日 15:21:57   作者:penngo  
这篇文章主要给大家介绍了关于Go实现mongodb增删改查工具类的相关资料,MongoDB是一个NoSQL数据库,它提供了灵活的文档存储模型以及强大的查询和操作功能,需要的朋友可以参考下

1、驱动下载

mongodb官方go介绍

使用例子https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example

快速入门https://www.mongodb.com/docs/drivers/go/current/quick-start/

要对mongodb进行增删改查,需要添加对应的go驱动依赖,安装命令

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

2、实现代码

2.1 Mongodb工具类代码

封装的工具类mongodao.go

package dao
import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
	"time"
)
type MondoDao struct {
	client     *mongo.Client
	db         *mongo.Database
	collection *mongo.Collection
}
func (dao *MondoDao) Connect(url string, db string, collection string) {
	var err error
	dao.client, err = mongo.Connect(context.TODO(), options.Client().SetConnectTimeout(time.Second*10).ApplyURI(url))
	if err != nil {
		log.Fatal(err)
	}
	dao.db = dao.client.Database(db)
	dao.collection = dao.db.Collection(collection)
}
// 插入一行
func (dao *MondoDao) InsertOne(obj any) (interface{}, error) {
	result, err := dao.collection.InsertOne(context.TODO(), obj)
	if err == nil {
		return result.InsertedID, err
	}
	return nil, err
}
// 插入多行
func (dao *MondoDao) InsertMany(objs []any) ([]interface{}, error) {
	result, err := dao.collection.InsertMany(context.TODO(), objs)
	if err != nil {
		return nil, err
	}
	return result.InsertedIDs, nil
}
// 查询一行
func (dao *MondoDao) FindOne(filter bson.M, obj any) error {
	result := dao.collection.FindOne(context.TODO(), filter)
	if result.Err() == nil {
		err := result.Decode(obj)
		return err
	}
	return result.Err()
}
// 查询多行
func (dao *MondoDao) FindMany(filter bson.M, obj any) error {
	cursor, err := dao.collection.Find(context.TODO(), filter)
	defer cursor.Close(context.TODO())
	if err == nil {
		err = cursor.All(context.TODO(), obj)
	}
	return err
}
// 分布查询多行
func (dao *MondoDao) FindManyByPage(filter bson.M, obj any, page int64, pagesize int64, sort bson.M) error {
	options := options.Find().SetSkip((page - 1) * pagesize).SetLimit(pagesize).SetSort(sort)
	cursor, err := dao.collection.Find(context.TODO(), filter, options)
	defer cursor.Close(context.TODO())
	if err == nil {
		err = cursor.All(context.TODO(), obj)
	}
	return err
}
// 删除一行
func (dao *MondoDao) DeleteOne(filter bson.M) (int64, error) {
	result, err := dao.collection.DeleteOne(context.TODO(), filter)
	if err == nil {
		return result.DeletedCount, err
	}
	return 0, err
}
// 删除多行
func (dao *MondoDao) DeleteMany(filter bson.M) (int64, error) {
	result, err := dao.collection.DeleteMany(context.TODO(), filter)
	if err == nil {
		return result.DeletedCount, err
	}
	return 0, err
}
// 删除集合
func (dao *MondoDao) DropCollection() error {
	err := dao.collection.Drop(context.TODO())
	//if err = nil {
	//	log.Fatal("drop collection %v", err)
	//}
	return err
}
// 更新一行
func (dao *MondoDao) UpdateOne(filter bson.M, update bson.M) (int64, error) {
	result, err := dao.collection.UpdateOne(context.TODO(), filter, update)
	if err == nil {
		return result.ModifiedCount, err
	}
	return 0, err
}
// 更新多行
func (dao *MondoDao) UpdateMany(filter bson.M, update bson.M) (int64, error) {
	result, err := dao.collection.UpdateMany(context.TODO(), filter, update)
	if err == nil {
		return result.ModifiedCount, err
	}
	return 0, err
}
/**
// 条件查询
$lt  	小于 				bson.M{"age": bson.M{"$lt": 20}}
$gt 	 大于 				bson.M{"age": bson.M{"$gt": 20}}
$lte 	小于等于 			bson.M{"age": bson.M{"$lte": 20}} bson.D{{"age", bson.D{{"$lte", 20}}}}
$gte 	大于等于 			bson.M{"age": bson.M{"$gte": 20}}
$ne 	不等于 				bson.M{"age": bson.M{"$ne": 20}}
$eq 	等于,可以省略这个符号 	bson.M{"age": bson.M{"$eq": 20}},bson.M{"age": 20}
$in 	在范围内 			bson.M{"age": bson.M{"$in": []int{16, 33}}}
$nin 	不在范围内 			bson.M{"age": bson.M{"$nin": []int{16, 33}}}
//
$inc 	对给定数值字段数加减 bson.M{"$inc": bson.M{"age": -5}}
$set 	设置字段值,如果字段不存在则创建 bson.M{"$set": bson.M{"age": 100}}
$unset 移除字段 {'$unset':{'Name':""}}
*/

2.2 使用例子

使用例子

package main
import (
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"log"
	"mymongodb/dao"
)
type User struct {
	ID   primitive.ObjectID `bson:"_id,omitempty"`
	Name string
	Age  int
}
func (s User) String() string {
	return fmt.Sprintf("%v %v %v", s.ID.Hex(), s.Name, s.Age)
}
func main() {
	dao := dao.MondoDao{}
	url := "mongodb://127.0.0.1:27017"
	dao.Connect(url, "gotest", "user")
	user1 := User{Name: "user1", Age: 66}
	id, _ := dao.InsertOne(user1)
	fmt.Printf("InsertOne id:%v\n", (id.(primitive.ObjectID)).Hex())
	user2 := []any{
		User{Name: "user2", Age: 66},
		User{Name: "user3_3", Age: 76},
		User{Name: "user3_4", Age: 88},
	}
	ids, _ := dao.InsertMany(user2)
	for index, id := range ids {
		fmt.Printf("InsertMany id:%v=%v\n", index, (id.(primitive.ObjectID)).Hex())
	}
	filter3 := bson.M{"name": "user2", "age": 66}
	var user3 User
	err := dao.FindOne(filter3, &user3)
	fmt.Printf("Findone user3:%v, %v\n", user3, err)
	var user4 []User
	filter4 := bson.M{"age": bson.M{"$gt": 60}}
	err4 := dao.FindMany(filter4, &user4)
	if err4 == nil {
		for index, v := range user4 {
			fmt.Printf("FindMany user4:%v, %v, \n", index, v)
		}
	}
	var users5 []User
	filter5 := bson.M{"age": bson.M{"$gt": 65}}
	sort := bson.M{"age": 1}
	err5 := dao.FindManyByPage(filter5, &users5, 1, 10, sort)
	if err5 == nil {
		for index, v := range users5 {
			fmt.Printf("FindManyByPage user5:%v, %v\n", index, v.String())
		}
	}
	filter8 := bson.M{"name": "user2"}
	update8 := bson.M{"$inc": bson.M{"age": +6}}
	count8, err8 := dao.UpdateOne(filter8, update8)
	fmt.Printf("UpdateOne count:%v, %v\n", count8, err8)
	filter9 := bson.M{"$or": []bson.M{bson.M{"name": "user1"}, bson.M{"name": "user2"}}}
	update9 := bson.M{"$set": bson.M{"age": 90}}
	count9, err9 := dao.UpdateMany(filter9, update9)
	fmt.Printf("UpdateMany count:%v, %v\n", count9, err9)
	filter6 := bson.M{"name": "user1", "age": 90}
	deletecount6, err6 := dao.DeleteOne(filter6)
	fmt.Printf("DeleteOne count:%v, %v\n", deletecount6, err6)
	filter7 := bson.M{"age": bson.M{"$gte": 66}}
	deletecount7, err7 := dao.DeleteMany(filter7)
	fmt.Printf("DeleteMany count:%v, %v\n", deletecount7, err7)
	err10 := dao.DropCollection()
	if err10 == nil {
		fmt.Println("drop Collection success!")
	} else {
		log.Fatal("drop collection error,%v", err)
	}
}

2.3 运行效果

D:\project\go\gotest\sql\mongodb>go run main.go
InsertOne id:64d32053a61a1841b70e129a
InsertMany id:0=64d32054a61a1841b70e129b
InsertMany id:1=64d32054a61a1841b70e129c
InsertMany id:2=64d32054a61a1841b70e129d
Findone user3:64d32054a61a1841b70e129b user2 66, <nil>
FindMany user4:0, 64d32053a61a1841b70e129a user1 66, 
FindMany user4:1, 64d32054a61a1841b70e129b user2 66, 
FindMany user4:2, 64d32054a61a1841b70e129c user3_3 76, 
FindMany user4:3, 64d32054a61a1841b70e129d user3_4 88, 
FindManyByPage user5:0, 64d32053a61a1841b70e129a user1 66
FindManyByPage user5:1, 64d32054a61a1841b70e129b user2 66
FindManyByPage user5:2, 64d32054a61a1841b70e129c user3_3 76
FindManyByPage user5:3, 64d32054a61a1841b70e129d user3_4 88
UpdateOne count:1, <nil>
UpdateMany count:2, <nil>
DeleteOne count:1, <nil>
DeleteMany count:3, <nil>
drop Collection success!

总结

到此这篇关于Go实现mongodb增删改查工具类的文章就介绍到这了,更多相关Go mongodb增删改查工具类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序

    Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序

    这篇文章主要介绍了Go外部依赖包vendor,$GOPATH和$GOPATH/pkg/mod下查找顺序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解Go语言中的结构体的特性

    详解Go语言中的结构体的特性

    结构体是Go语言中重要且灵活的概念之一,本文旨在深入介绍Go语言中的结构体,揭示其重要性和灵活性,并向读者展示结构体支持的众多特性,需要的可以参考一下
    2023-06-06
  • Go语言基础数组用法及示例详解

    Go语言基础数组用法及示例详解

    这篇文章主要为大家介绍了Go语言基础Go语言数组的用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • Go语言中map集合的具体使用

    Go语言中map集合的具体使用

    本文主要介绍了Go语言中map集合的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 解决golang json解析出现值为空的问题

    解决golang json解析出现值为空的问题

    这篇文章主要介绍了解决golang json解析出现值为空的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang文件服务器的两种方式(可以访问任何目录)

    golang文件服务器的两种方式(可以访问任何目录)

    这篇文章主要介绍了golang文件服务器的两种方式,可以访问任何目录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • golang值接收者和指针接收者的区别介绍

    golang值接收者和指针接收者的区别介绍

    这篇文章主要介绍了golang值接收者和指针接收者的区别,它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法,接收者可以是值接收者,也可以是指针接收者,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • vscode如何debug调试golang代码

    vscode如何debug调试golang代码

    古话说工欲善其事必先利其器,Go语言程序的开发者而言,当下最火的IDE应该非微软的Visual Studio Code莫属,本文主要介绍了vscode如何debug调试golang代码,感兴趣的可以了解一下
    2024-03-03
  • Go语言MySQLCURD数据库操作示例详解

    Go语言MySQLCURD数据库操作示例详解

    这篇文章主要为大家介绍了Go语言MySQLCURD数据库操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang一些常用的静态检查工具详解

    golang一些常用的静态检查工具详解

    这篇文章主要介绍了golang一些常用的静态检查工具,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论