吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1517|回复: 3
收起左侧

[其他转载] go-mongodb 基础介绍

[复制链接]
XMQ 发表于 2021-10-13 16:08
go    mongo

1. 定义

          mongodb 是 NoSql 数据库,通常的Sql遵循ACID原则,即原子性/一致性/独立性/持久性,而NoSql并不需要遵循此原则。与一般sql相比,Nosql最大的区别在于存储数据的灵活性,通过键值对形式储存。可以存储复杂的数据格式,以二进制形式存储,免去sql分表,联查的麻烦。而mongodb是Nosql中使用最广泛的,是一个基于分布式开源的数据库文件系统,由C++编写。具有高性能,高可用和可伸缩性。

2.  基本操作

       安装/下载  自行百度~~

       这里列出常用的一些命令,其余可查看官网文档。
show dbs; 显示当前所有数据库
use   xxxx 切换到xxx数据库
show collections; 查看数据库中所有的数据集
db.collection.find()
db.collection.find().pretty()  //精简显示
db.collection.find({key:value})  // 查找指定数据
db.collection.find({key:value}).count()  //查看相应的数量
查看数据集详细信息
db.collection.insert(doc)    #doc 指查询条件 像数据集插入一条数据
db.collection.deleteOne(doc)   
db.collection.deleteMany(doc)
删除一条相应数据集数据
删除多条相应数据集数据
db.collection.update(doc,update)   # update  指更新内容 更新相应的数据集
db.getCollectionNames(); 显示当前数据集所有数据集
db.version()
查看db版本
db.dropDatabase(); 删除当前数据库
3.  go  操作mongodb (在mongodb每插入一条数据,除了特殊指定外,每条数据都会自动生成一个_id 即ObjectId。类似sql的自增id)
    3.1  下载相关依赖包
            "go.mongodb.org/mongo-driver/bson"
          "go.mongodb.org/mongo-driver/mongo"

          "go.mongodb.org/mongo-driver/mongo/options"

   3.2    连接,在连接时我们使用context.WithTimeout,如果连接超时就自动取消。
func ConnectToDB(url,name string,timeout time.Duration,num uint64)(*mongo.Database,error){   ctx, cancel := context.WithTimeout(context.Background(), timeout)
   defer cancel()   // 最后关闭
   o := options.Client().ApplyURI(url)
   o.SetMaxPoolSize(num)  //设置最大连接数
   client, err := mongo.Connect(ctx, o)
   if err != nil {
      return nil, err
   }
   return client.Database(name), nil  //这里直接返回对应数据库的指针
}

  调用
myClient, err := ConnectToDB("mongodb://127.0.0.1:27017","bigdata",10,100) //地址,数据库名称,连接数量if err != nil {
   fmt.Println("数据库连接失败")
}

    获取对应数据集,接下来就可以对这个数据集进行增删改查等操作
collection := myClient.Collection("grade")
插入,先创建相应的结构体,赋值并插入数据集
type Grade struct {   Id primitive.ObjectID `json:"_id" bson:"_id"` //返回_id
   Grade_id int `json:"grade_id"`
   Money int `json:"money"`
  
}
s2 := rep.Grade{   Id: primitive.NewObjectID(),
   Grade_id: 1,
   Money: 500,
}
insertResult, err := collection.InsertOne(context.TODO(), s2)  // 插入一条数据,使用collection.InsertMany可插入多条数据if err != nil {
   log.Print(err)
   fmt.Println("err",err)
   return
}
fmt.Println("Inserted a single document: ", insertResult.InsertedID)
更新 (需要定义查询条件/过滤条件和更新内容)
//过滤条件:  filter := bson.D{{"Grade_id",1}}
// 更新内容update := bson.D{
   {"$set", bson.D{
      {"Money", 999},
   }},}
updateResult, err := collection.UpdateMany(context.TODO(),filter,update) // 更新多条数据if err != nil {
   log.Print(err)
   fmt.Println("err",err)
   return
}
删除
deleteResult, err := collection.DeleteMany(context.TODO(), filter2)fmt.Println("deleteResult",deleteResult)
查询也是一样
err = collection.FindOne(context.TODO(),filter).Decode(&img) 查询一条数据,并且自定义返回格式img
cursor,err := collection.Aggregate(context.TODO(),filter) //获取游标defer cursor.Close(context.TODO())  //最后关闭游标
if err = cursor.All(context.TODO(),&img) //获取全部数据
err != nil {
   fmt.Println("cursor_err",err)
}
var h []Grade  //新建一个空list
for _, result := range img{   //遍历
   h = append(h,Grade{
      Grade_id: result.Datas[1].ImageTitle, //添加数据
      Money: result.Datas[1].ImagePath,
   })
}
获取过滤条件全部数据
还有一个通过ObjectId来查询。
oid ,err:= primitive.ObjectIDFromHex("6160224cd05c21cf50e1bca3"); 获取ObijectId
filter2 :=bson.M{"_id":oid}err = collection.FindOne(context.TODO(),filter2).Decode(&img)
以上是简单的增删改查操作.ObjectId 的其他用法:
id := bson.NewObjectId() 生成新的ObjectId
idTime := id.Time() 从ObjectId中获取时间戳
idMac := id.Machine() 从ObjectId中获取机器码
idPid := id.Pid() 从ObjectId中获取进程id
idCount := id.Counter() 从OjbectId中获取随机数


本帖被以下淘专辑推荐:

  • · 好帖|主题: 549, 订阅: 87

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lossweight 发表于 2021-10-13 17:33
go mango做服务端吗?
lf1988103 发表于 2021-10-14 09:02
JDawLai 发表于 2023-3-18 09:31
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表