IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> GoLang 操作MongoDB数据库 -> 正文阅读

[大数据]GoLang 操作MongoDB数据库

GoLang 操作MongoDB数据库

数据库中的数据结构

在这里插入图片描述

定义的结构体

  • bson:"xxx"用来映射在MongoDB中的名称,如果不写默认小写
type Student struct {
	Name     string `bson:"Name"`
	Age      int    `bson:"Age"`
	Sex      bool   `bson:"Sex"`
	IsDelete bool   `bson:"IsDelete"`
}

下载对应操作数据库的包

  • go.mongodb.org

封装操作MongoDB数据的结构体

  • 定义结构体
type MongoHelper struct {
	Options        *options.ClientOptions
	Client         *mongo.Client
	DBName         string
	CollectionName string
	IsConnected    bool
	Url            string
}
  • MongoHelper的方法
const TIME_OUT = 10

// Connect 连接数据库
func (mh *MongoHelper) Connect(url string) error {
	if mh.IsConnected {
		return errors.New("[MongoDB] IsConnected Not Again Connect")
	}
	mh.Url = url
	mh.Options = options.Client().ApplyURI(url)
	client, err := mongo.Connect(context.TODO(), mh.Options)
	if err != nil {
		fmt.Println("[MongoDB] Connect Error:", err)
		return err
	}
	mh.Client = client
	err = client.Ping(context.TODO(), nil)
	if err != nil {
		fmt.Println("[MongoDB] Connect Ping Error:", err)
		return err
	}
	fmt.Println("[MongoDB] Connect Success!")
	mh.IsConnected = true
	return nil
}

// FindAll 从数据库中查找所有的数据
func (mh *MongoHelper) FindAll() ([]bson.M, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	cur, err := collection.Find(ctx, bson.D{})
	if err != nil {
		fmt.Println("[MongoDB] FindAll Error:", err)
		return nil, err
	}
	defer cur.Close(ctx)
	retValue := make([]bson.M, 0, 50)
	for cur.Next(ctx) {
		var result bson.D
		err = cur.Decode(&result)
		if err != nil {
			fmt.Println("[MongoDB] Decode Error:", err)
			return nil, err
		}
		retValue = append(retValue, result.Map())
	}
	return retValue, nil
}

// FindMany 从数据库中查找符合条件的一些数据
func (mh *MongoHelper) FindMany(filter bson.D) ([]bson.M, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	cur, err := collection.Find(ctx, filter)
	if err != nil {
		fmt.Println("[MongoDB] Find Error:", err)
		return nil, err
	}
	defer cur.Close(ctx)
	retValue := make([]bson.M, 0, 50)
	for cur.Next(ctx) {
		var result bson.D
		err = cur.Decode(&result)
		if err != nil {
			fmt.Println("[MongoDB] Decode Error:", err)
			return nil, err
		}
		retValue = append(retValue, result.Map())
	}
	return retValue, nil
}

// InsertOne 向数据库中插入一条数据
func (mh *MongoHelper) InsertOne(document any) (primitive.ObjectID, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return primitive.ObjectID{}, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	result, err := collection.InsertOne(ctx, document)
	if err != nil {
		fmt.Println("[MongoDB] InsertOne Error: ", err)
		return primitive.ObjectID{}, err
	}
	return result.InsertedID.(primitive.ObjectID), nil
}

// InsertMany 向数据库中插入多条数据
func (mh *MongoHelper) InsertMany(document []any) ([]primitive.ObjectID, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	result, err := collection.InsertMany(ctx, document)
	if err != nil {
		fmt.Println("[MongoDB] InsertMany Error: ", err)
		return nil, err
	}
	slice := make([]primitive.ObjectID, 0, len(result.InsertedIDs))
	for i := 0; i < len(result.InsertedIDs); i++ {
		slice = append(slice, result.InsertedIDs[i].(primitive.ObjectID))
	}
	return slice, nil
}

// UpdateByID 根据ID更新数据库中的一条数据
func (mh *MongoHelper) UpdateByID(id primitive.ObjectID, update bson.D) (*mongo.UpdateResult, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	result, err := collection.UpdateByID(ctx, id, update)
	if err != nil {
		fmt.Println("[MongoDB] UpdateByID Error: ", err)
		return nil, err
	}
	return result, nil
}

// UpdateOne 更新数据库中的一条数据
func (mh *MongoHelper) UpdateOne(filter bson.D, update bson.D) (*mongo.UpdateResult, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	result, err := collection.UpdateOne(ctx, filter, update)
	if err != nil {
		fmt.Println("[MongoDB] UpdateOne Error: ", err)
		return nil, err
	}
	return result, nil
}

// UpdateMany 更新数据库中的多条数据
func (mh *MongoHelper) UpdateMany(filter bson.D, update bson.D) (*mongo.UpdateResult, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
	defer cancel()
	collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
	result, err := collection.UpdateMany(ctx, filter, update)
	if err != nil {
		fmt.Println("[MongoDB] UpdateMany Error: ", err)
		return nil, err
	}
	return result, nil
}

// DeleteOne 删除数据库中的一条数据
func (mh *MongoHelper) DeleteOne(filter bson.D, isDelete bool) (*mongo.DeleteResult, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	if isDelete {
		ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
		defer cancel()
		collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
		result, err := collection.DeleteOne(ctx, filter)
		if err != nil {
			fmt.Println("[MongoDB] DeleteOne Error: ", err)
			return nil, err
		}
		return result, nil
	} else {
		update := bson.D{}
		result, err := mh.UpdateOne(filter, update)
		if err != nil {
			fmt.Println("[MongoDB] DeleteOne IsDelete Error: ", err)
			return nil, err
		}
		return &mongo.DeleteResult{DeletedCount: result.ModifiedCount}, nil
	}
}

// DeleteMany 删除数据库中的多条数据
func (mh *MongoHelper) DeleteMany(filter bson.D, isDelete bool) (*mongo.DeleteResult, error) {
	if !mh.IsConnected {
		connectError := mh.Connect(mh.Url)
		if connectError != nil {
			return nil, connectError
		}
	}
	if isDelete {
		ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
		defer cancel()
		collection := mh.Client.Database(mh.DBName).Collection(mh.CollectionName)
		result, err := collection.DeleteMany(ctx, filter)
		if err != nil {
			fmt.Println("[MongoDB] DeleteMany Error: ", err)
			return nil, err
		}
		return result, nil
	} else {
		update := bson.D{}
		result, err := mh.UpdateMany(filter, update)
		if err != nil {
			fmt.Println("[MongoDB] DeleteMany IsDelete Error: ", err)
			return nil, err
		}
		return &mongo.DeleteResult{DeletedCount: result.ModifiedCount}, nil
	}
}

func NewMongoHelper(dbName, collectionName string) *MongoHelper {
	return &MongoHelper{
		DBName:         dbName,
		CollectionName: collectionName,
		IsConnected:    false,
	}
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:31:26  更:2022-05-12 16:32:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 9:54:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码