Go操作MongoDB

前言:我们知道数据库是用来存储我们的数据的,但是数据库同样需要我们来管理,这里我们来介绍一下如何使用Go语言来对MongoDB进行操作

一、Go连接MongoDB端口

首先我们需要让go连接MongoDB端口,我们可以这样做:

Database

这是我的文件目录结构

在main中:


func main() {
    c := context.Background()
    //连接MongoDB端口
  /*
  Connect 创建一个新的客户端,然后使用 Connect 方法对其进行初始化。 这相当于调用 NewClient,然后调用 Client.Connect。
  */
    mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar")) 
    if err != nil {
        panic(err)  //这里就不具体但进行错误处理了
    }
    //连入MongoDB中的数据库coolcar中的account
    col := mc.Database("coolcar").Collection("account")

这样我们就成功连接上了MongoDB端口,并且可以对coolcar中的account进行操作了

下面来写两个函数来操作数据库:

//向数据库写入数据
func insertRows(c context.Context, col *mongo.Collection) {
    res, err := col.InsertMany(c, []interface{}{ //向数据库中写入数据
        bson.M{
            "open_id": "001",
        },
        bson.M{
            "open_id": "002",
        },
        bson.M{
            "open_id": "003",
        },
    })
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", res)
}

我们在main()中调用:


func main() {
    c := context.Background()
    //连接MongoDB端口
  /*
  Connect 创建一个新的客户端,然后使用 Connect 方法对其进行初始化。 这相当于调用 NewClient,然后调用 Client.Connect。
  */
    mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar")) 
    if err != nil {
        panic(err)  //这里就不具体但进行错误处理了
    }
    //连入MongoDB中的数据库coolcar中的account
    col := mc.Database("coolcar").Collection("account")

  //调用函数
  insertRows(c, col)

打印结果:(数据就已经写入数据库了)

&{InsertedIDs:[ObjectID("6232caa11b0ff048aabc3808") ObjectID("6232caa11b0ff048aabc3809") ObjectID("6232caa11b0ff048aabc380a")]}

打开数据库我们可以看到:

Database

接下来再来写一个查找数据库的函数:

func findRows(c context.Context, col *mongo.Collection) {
    cur, err := col.Find(c, bson.M{})
    if err != nil {
        panic(err)
    }
    for cur.Next(c) {
        var row struct {
            ID     primitive.ObjectID `bson:"_id"`
            OpenID string             `bson:"open_id"`
        }
        err = cur.Decode(&row)
        if err != nil {
            panic(err)
        }
        fmt.Printf("%+v\n", row)
    }
}

这里我们还是来了解一下对应的方法:

  1. col.Find(c, bson.M{})

    函数声明:

    func (*mongo.Collection).Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error)
    Find 执行 find 命令并返回集合中匹配文档的 Cursor。
    
    filter 参数必须是包含查询运算符的文档,并且可用于选择结果中包含哪些文档。 它不能为零。 应使用空文档(例如 bson.D{})来包含所有文档。
  2. cur.Next(c)

    函数声明:

    func (*mongo.Cursor).Next(ctx context.Context) bool
    Next 获取此游标的下一个文档。 如果没有错误并且游标没有耗尽,则返回 true。
    
    Next 阻塞,直到文档可用、发生错误或 ctx 过期。 如果 ctx 过期,错误将被设置为 ctx.Err()。 在错误情况下,Next 将返回 false。
    
    如果 Next 返回 false,则后续调用也将返回 false
  3. cur.Decode(&row)

    函数声明:

    func (*mongo.Cursor).Decode(val interface{}) error
    Decode 会将当前文档解组为 val 并返回解组过程中的任何错误而不进行任何修改。 如果 val 为 nil 或类型为 nil,则会返回错误。

调用此函数打印结果:

{ID:ObjectID("623186a83dbbceb3de249c40") OpenID:123}
{ID:ObjectID("623186a83dbbceb3de249c41") OpenID:456}
{ID:ObjectID("62319fb5238127d009269726") OpenID:olSZV5QLR587RJZCV8OB-29qdR4Q}
panic: error decoding key _id: an ObjectID string must be exactly 12 bytes long (got 2)

​```当然该数据库中还有其他数据,因为ObjectID的原因,程序panic了```
本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
118
粉丝
89
喜欢
173
收藏
246
排名:365
访问:2.6 万
私信
所有博文
社区赞助商