看代码吧
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