Go 与 MongoDB 数据库


MongoDB 基础入门


MongoDB 简介

基于分布式文件存储的非关系型数据库(NoSQL),为 Web 应用提供可扩展的高性能数据存储解决方案。


数据库操作

  • 启动数据库
mongod
  • 数据库连接
mongodb://[username:password@]host1[:port1][, host2[:port2], ...[/[database][?options]]
mongodb://localhost
mongodb://localhost, localhost:27018, localhost:27019
  • 创建数据库
use DATABASE_NAME
use mongo_db
  • 删除数据库
db.dropDatabase()

集合操作

  • 创建集合
db.createCollection(name, options)
db.createCollection("my_collection")
  • 删除集合
db.collection.drop()
db.my_collection.drop()

文档操作

  • 插入文档
db.collection.insert(document)
db.collection.save(document)
db.my_collection.insert({"name": "tt", "address": "hz"})
  • 查询文档
db.collection.find(query, projection)
db.my_collection.find({})
db.my_collection.find({"name": "tt", "address": "hz"})
db.my_collection.find({"name": {"$ne": "hz"}})
db.my_collection.find({}).count()
db.my_collection.find({}).limit(1)
db.my_collection.find({}).sort({"name": 1})
  • 修改文档
db.collection.update(<query>, <update>, {upsert: <boolean>, multi: <boolean>, writeConcern: <document>})
db.my_collection.update({'name': 'barry'}, {$set: {'address': 'hz'}})
db.collection.save(<document>, {writeConcern: <document>})
db.my_collection.save({"_id": ObjectId("deetete"), "name": "jack", "address": "hz"})
  • 删除文档
db.collection.remove(<query>, {justOne: <boolean>, writeConcern: <document>})
do.my_collection.remove({'name': 'jack'})
  • 去重文档
db.collection.distinct(field, query, options)
db.my_collection.distinct("name", {"address": {"$ne": "sh"}})

Go 访问 MongoDB


连接数据库

package main

import (
		"context"
		"fmt"
		"go.mongodb.org/mongo-driver/mongo"
		"go.mongodb.org/mongo-driver/mongo/options"
		"time"
)
func main() {
		var (
				client     *mongo.Client
				err        error
				db         *mongo.Database
				collection *mongo.Collection
		)
		//连接MongoDB
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
				fmt.Print(err)
				return
		}
	
		//检查连接
		err = client.Ping(context.TODO(), nil)
		if err != nil {
				fmt.Print(err)
				return
		}
	
		//选择数据库 my_db
		db = client.Database("my_db")

		//选择表 my_collection
		collection = db.Collection("my_collection")
		fmt.Println(collection)
}

插入一条数据

package main

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

type ExecTime struct {
		StartTime int64 `bson:"startTime"` //开始时间
		EndTime   int64 `bson:"endTime"`   //结束时间
}

type LogRecord struct {
		JobName string `bson:"jobName"` //任务名
		Command string `bson:"command"` //shell命令
		Err     string `bson:"err"`     //脚本错误
		Content string `bson:"content"` //脚本输出
		Tp      ExecTime                //执行时间
}

func main() {
		var (
				client     *mongo.Client
				err        error
				collection *mongo.Collection
				iResult    *mongo.InsertOneResult
				id         primitive.ObjectID
		)
	
	
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
				fmt.Print(err)
				return
		}
	
		//选择数据库my_db里的某个表
		collection = client.Database("my_db").Collection("my_collection")

		//插入某一条数据
		logRecord := LogRecord{
				JobName: "job1",
				Command: "echo 1",
				Err:     "",
				Content: "1",
				Tp: ExecTime{
					StartTime: time.Now().Unix(),
					EndTime:   time.Now().Unix() + 10,
				},
		}
		if iResult, err = collection.InsertOne(context.TODO(), logRecord); err != nil {
				fmt.Print(err)
				return
		}
	
		//_id:默认生成一个全局唯一ID
		id = iResult.InsertedID.(primitive.ObjectID)
		fmt.Println("自增ID", id.Hex())
}

批量插入数据

package main

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

type ExecTime struct {
		StartTime int64 `bson:"startTime"` //开始时间
		EndTime   int64 `bson:"endTime"`   //结束时间
}

type LogRecord struct {
		JobName string `bson:"jobName"` //任务名
		Command string `bson:"command"` //shell命令
		Err     string `bson:"err"`     //脚本错误
		Content string `bson:"content"` //脚本输出
		Tp      ExecTime                //执行时间
}

func main() {
		var (
			client     *mongo.Client
			err        error
			collection *mongo.Collection
			result    *mongo.InsertManyResult
			id         primitive.ObjectID
		)
	
	
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
				fmt.Print(err)
				return
		}
	
		//选择数据库my_db里的某个表
		collection = client.Database("my_db").Collection("test")

		//批量插入
		result, err = collection.InsertMany(context.TODO(), []interface{}{
			LogRecord{
					JobName: "job multil1",
					Command: "echo multil1",
					Err:     "",
					Content: "1",
					Tp: ExecTime{
							StartTime: time.Now().Unix(),
							EndTime:   time.Now().Unix() + 10,
					},
			},
			LogRecord{
					JobName: "job multil2",
					Command: "echo multil2",
					Err:     "",
					Content: "2",
					Tp: ExecTime{
						StartTime: time.Now().Unix(),
						EndTime:   time.Now().Unix() + 10,
				},
			},
		});
		if err != nil {
				log.Fatal(err)
		}
		if result == nil {
				log.Fatal("result nil")
		}
	
		for _, v := range result.InsertedIDs {
				id = v.(primitive.ObjectID)
				fmt.Println("自增ID", id.Hex())
		}
}

查询数据

package main

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

type ExecTime struct {
		StartTime int64 `bson:"startTime"` //开始时间
		EndTime   int64 `bson:"endTime"`   //结束时间
}

type LogRecord struct {
		JobName string `bson:"jobName"` //任务名
		Command string `bson:"command"` //shell命令
		Err     string `bson:"err"`     //脚本错误
		Content string `bson:"content"` //脚本输出
		Tp      ExecTime                //执行时间
}

//查询实体
type FindByJobName struct {
		JobName string `bson:"jobName"` //任务名
}

func main() {
		var (
			client     *mongo.Client
			err        error
			collection *mongo.Collection
			cursor     *mongo.Cursor
	)
	
	
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
			fmt.Print(err)
			return
		}
	
		//选择数据库my_db里的某个表
		collection = client.Database("my_db").Collection("test")
	cond := FindByJobName{JobName: "job multil1"}
		if cursor, err = collection.Find(
				context.TODO(),
				cond,
				options.Find().SetSkip(0),
				options.Find().SetLimit(2)); err != nil {
						fmt.Println(err)
						return
				}
				defer func() {
				if err = cursor.Close(context.TODO()); err != nil {
						log.Fatal(err)
				}
		}()

			//遍历游标获取结果数据
		for cursor.Next(context.TODO()) {
				var lr LogRecord
				//反序列化Bson到对象
				if cursor.Decode(&lr) != nil {
						fmt.Print(err)
						return
				}
				fmt.Println(lr)
		}
	
		var results []LogRecord
		if err = cursor.All(context.TODO(), &results); err != nil {
				log.Fatal(err)
		}
	
		for _, result := range results {
				fmt.Println(result)
		}
}
package main

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

type ExecTime struct {
		StartTime int64 `bson:"startTime"` //开始时间
		EndTime   int64 `bson:"endTime"`   //结束时间
}

type LogRecord struct {
		JobName string `bson:"jobName"` //任务名
		Command string `bson:"command"` //shell命令
		Err     string `bson:"err"`     //脚本错误
		Content string `bson:"content"` //脚本输出
		Tp      ExecTime                //执行时间
}

//查询实体
type FindByJobName struct {
		JobName string `bson:"jobName"` //任务名
}

func main() {
		var (
			client     *mongo.Client
			err        error
			collection *mongo.Collection
			cursor     *mongo.Cursor
		)
	
	
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
				fmt.Print(err)
				return
		}
	
		//选择数据库my_db里的某个表
		collection = client.Database("my_db").Collection("test")
		filter := bson.M{"jobName":"job multil1"}
		if cursor, err = collection.Find(
				context.TODO(),
				filter,
				options.Find().SetSkip(0),
				options.Find().SetLimit(2)); err != nil {
				log.Fatal(err)
		}
		defer func() {
				if err = cursor.Close(context.TODO()); err != nil {
						log.Fatal(err)
				}
		}()
	
		var results []LogRecord
		if err = cursor.All(context.TODO(), &results); err != nil {
				log.Fatal(err)
		}
	
		for _, result := range results {
				fmt.Println(result)
		}
}

BSON 复合查询

BSON,JSON 的二进制表示,两大类型表示 BSON 数据:

一、D类型

4 个子类:

  • D:BSON 文档,有序 map 。
  • M:无序 map 。
  • A:一个 BOSN 数组。
  • E:D 中的一个元素。
bson.D{{
		"name",
		bson.D{{
				"$in",
				bson.A{"Jim", "Jack"},
		}}
}}

二、Raw 类型

验证字节切片,反序列化 BSON 。

package main

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

func main() {
		testM := bson.M{
			"jobName": "job multi1",
		}
		var raw bson.Raw
		tmp, _ := bson.Marshal(testM)
		bson.Unmarshal(tmp, &raw)

		fmt.Println(testM)
		fmt.Println(raw)
}

聚合查询

package main

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

func main() {
		var (
				client     *mongo.Client
				collection *mongo.Collection
				err        error
				cursor     *mongo.Cursor
		)
	
		if client, err = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017").SetConnectTimeout(5*time.Second)); err != nil {
				fmt.Print(err)
				return
		}
	
		collection = client.Database("my_db").Collection("test")
		//按照jobName分组,countJob中存储每组的数目
		groupStage := mongo.Pipeline{bson.D{
				{"$group", bson.D{
						{"_id", "$jobName"},
						{"countJob", bson.D{
						{"$sum", 1},
				}},
			}},
		}}
		if cursor, err = collection.Aggregate(context.TODO(), groupStage, ); err != nil {
				log.Fatal(err)
		}
		defer func() {
				if err = cursor.Close(context.TODO()); err != nil {
					log.Fatal(err)
				}
		}()
		var results []bson.M
		if err = cursor.All(context.TODO(), &results); err != nil {
				log.Fatal(err)
		}
		for _, result := range results {
				fmt.Println(result)
		}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

물の韜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值