golang mongodb

看代码吧

package main

// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example
// 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/
import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var client *mongo.Client    //实例
var mondb *mongo.Database   //数据库,相当于 dbname
var tab11 *mongo.Collection //集合,相当于表
var err error

func init() {
	url := "mongodb://192.168.0.60:27017//"
	client, err = mongo.Connect(context.TODO(), options.Client().SetConnectTimeout(time.Second*10).ApplyURI(url)) //实例
	if err != nil {
		log.Fatal(err)
	}

	mondb = client.Database("test11")
	tab11 = mondb.Collection("tab11")
}

// 定义结构体
type student struct {
	ID   primitive.ObjectID `bson:"_id,omitempty"`
	Name string
	Age  int
}

// 结构体方法,自定义输出
func (s student) String() string {
	return fmt.Sprintf("%v %v %v", s.ID, s.Name, s.Age)
}

// 插入一行
func insertone() {
	stu1 := student{Name: "Zhangs", Age: 66}
	result, err := tab11.InsertOne(context.TODO(), stu1)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	fmt.Printf("result: %v\n", result.InsertedID)
}

// 插入多行
func insertmany() {
	stu2 := []any{
		student{Name: "a", Age: 66},
		student{Name: "bb", Age: 88},
	}
	results, err := tab11.InsertMany(context.TODO(), stu2)
	// results, err := tab11.InsertMany(context.TODO(), []any{student{Name: "a", Age: 22}, student{Name: "aa", Age: 98}})
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	fmt.Printf("results.InsertedIDs: %v\n", results.InsertedIDs)
}

// 查询一行
func findone() {
	// m1 := map[string]string{"name": "zhanggs", "age": "33"}
	filter := bson.M{"name": "Zhangs", "age": 66} //name  age 小写
	var s2 student
	result := tab11.FindOne(context.TODO(), filter)
	if result.Err() != nil {
		fmt.Printf("result.Err(): %v\n", result.Err())
	}
	err := result.Decode(&s2)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	fmt.Printf("s2: %v\n", s2)
}

// 多条查询 一次性全部装入[]student
func findmany() {
	var s3 []student

	filter := bson.M{"name": "a", "age": bson.M{"$gt": 1}} //name  age 小写
	// filter := bson.M{} //无条件,全部符合

	cursor, err := tab11.Find(context.TODO(), filter) //结果集游标  cursor   *mongo.Cursor
	if err != nil {
		log.Fatal(err)
	}
	defer cursor.Close(context.TODO()) //关闭游标

	err = cursor.All(context.TODO(), &s3) //全部装入 切片类型的指针中  results argument must be a pointer to a slice
	if err != nil {
		log.Fatal("Decode err: ", err)
	}

	for _, v := range s3 { //遍历,一行行打印出来
		fmt.Printf("v: %v\n", v)
	}

}

// 多条查询,逐条装入
func findmanyv2() {
	var s3 student //因为是逐条返回,所以这里不是切片[]

	filter := bson.M{"name": "zhangs", "age": 33} //name  age 小写
	// filter := bson.M{} //无条件,全部符合

	cursor, err := tab11.Find(context.TODO(), filter) //结果集游标  cursor   *mongo.Cursor
	if err != nil {
		log.Fatal(err)
	}
	defer cursor.Close(context.TODO()) //关闭游标

	for cursor.Next(context.TODO()) {
		err = cursor.Decode(&s3) //逐条输入
		if err != nil {
			log.Fatalf("decode log: %v", s3)
		}
		fmt.Printf("s3: %v\n", s3)
	}
}

// 删除一行
func deleteone() {
	filter := bson.M{"name": "zhangs", "age": 33} //name  age 小写
	deleteResult, err := tab11.DeleteOne(context.TODO(), filter)
	if err != nil {
		log.Fatalf("deleteone : %v", err)
	}
	fmt.Printf("deleteResult.DeletedCount: %v\n", deleteResult.DeletedCount)
}

// 删除多行
func deletemany() {
	a := map[string]any{"name": "a", "age": 66}
	fiter := bson.M(a)
	deletemanyresult, err := tab11.DeleteMany(context.TODO(), fiter)
	if err != nil {
		log.Fatalf("deletemanyresult : %v", err)
	}
	fmt.Printf("deletemanyresult.DeletedCount: %v\n", deletemanyresult.DeletedCount) //返回删除的行数
}

// drop集合tab11
func deletecoll() {
	err = tab11.Drop(context.TODO())
	if err != nil {
		log.Fatalf("drop tab11 %v", err)
	}
}

// 查询所有
func findall() {
	filter := bson.M{}
	var stu []student
	options := options.Find().SetLimit(5).SetSort(bson.M{"age": 1})
	cursor, _ := tab11.Find(context.TODO(), filter, options)
	err = cursor.All(context.TODO(), &stu)
	for _, v := range stu {
		fmt.Printf("v: %v\n", v)
	}
}

// 构造函数-查询
func find(tab *mongo.Collection, filter primitive.M, opts *options.FindOptions) {
	var stu []student
	cursor, err := tab.Find(context.TODO(), filter, opts)
	if err != nil {
		log.Fatalf("cursor :%v", err)
	}
	err = cursor.All(context.TODO(), &stu)
	if err != nil {
		log.Fatalf("cursorAll %v", err)
	}
	for _, v := range stu {
		fmt.Printf("v: %v\n", v)
	}
}


// update 一行
func updateone() {
	filter := bson.M{"age": 66}
	updat := bson.M{"$inc": bson.M{"age": +6}} //这里必须使用 更新操作符 $inc   $set   $inc 把age 的值 + 6
	// opts := options.Update()
	Result, err := tab11.UpdateOne(context.TODO(), filter, updat)
	if err != nil {
		fmt.Printf("updateone: %v\n", err)
	}
	fmt.Printf("Result.ModifiedCount: %v\n", Result.ModifiedCount)
}

// 更新多行
func updatemany() {
	filter := bson.M{"name": "a"}
	update := bson.M{"$set": bson.M{"age": 100}} //这里必须使用 更新操作符 $inc   $set  $set 把age  改为100
	results, err := tab11.UpdateMany(context.TODO(), filter, update)
	if err != nil {
		fmt.Printf("updatemany: %v\n", err)
	}
	fmt.Printf("results.ModifiedCount: %v\n", results.ModifiedCount)
}

func main() {
	updatemany()
	// updateone()
	// find(tab11, bson.M{}, options.Find().SetSort(bson.M{"age": 1}))
	// findall()
	// findone()
	// insertone()
	// insertmany()
	// findmany()
	// findmanyv2()
	// deleteone()
	// deletemany()
	// deletecoll()
}

排序

降序
options.Find().SetLimit(5).SetSort(bson.M{"age": -1})
升序
options.Find().SetLimit(5).SetSort(bson.M{"age": 1})
查询5条
options.Find().SetLimit(5)

分页

*options.FindOptions.SetSkip(1)  // offset
*options.FindOptions.SetLimit(1) // limit

条件查询
filter := bson.M{“name”: “a”, “age”: bson.M{“$gt”: 1}} //name = a , age > 1

$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':""}}

-------------end

你可能感兴趣的:(GO,#,golang,mongodb,开发语言)