一架梯子,一头程序猿,仰望星空!
GoLang MongoDB教程 > 内容正文

Golang MongoDB快速入门教程


本教程从Golang语言角度介绍MongoDB的基本操作。

提示:本教程使用MongoDB的官方提供的Go语言驱动包操作MongoDB。

前置教程

MongoDB教程

提示:不熟悉MongoDB,请先学习下MongoDB知识,Golang教程不会重复介绍相关知识。

基本要求

  • Go 1.10以上
  • MongoDB 2.6以上

安装依赖

go get go.mongodb.org/mongo-driver/mongo

连接MongoDB

import (
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

// MongoDB连接地址
uri := "mongodb://localhost:27017"
// 获取上下文对象,可以设置超时时间
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// 连接MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

Connect函数不会阻塞协程,也就是说调用Connect方法之后,直接操作MongoDB可能会因为MongoDB还没连接成功而报错,可以使用Ping方法检测下MongoDB是否连接成功。

// PIng下MongoDB,如果连接成功不会返回错误
err = client.Ping(ctx, readpref.Primary())

MongoDB连接地址

MongoDB连接地址,包括服务器地址、端口号、账号、密码等关键信息。
格式如下:

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

例子:

// 使用默认账号密码,连接localhost:27017地址
mongodb://localhost:27017

// 连接localhost:27017地址,账号=root, 密码=123456,连接默认数据库=admin
mongodb://root:123456@localhost:27017/admin

释放连接资源

如果不使用连接了,需要手动释放连接资源

defer func() {
    if err = client.Disconnect(ctx); err != nil {
        panic(err)
    }
}()

获取集合实例

golang操作MongoDB首先得拿到集合实例,才可以对集合实例进行增删改查。

// 通过Database设置数据库名,通过Collection设置集合名字
collection := client.Database("testing").Collection("numbers")

提示:根据MongoDB的特性,所操作数据库和集合,并不要求提前创建好,在首次写入数据的时候会自动创建。

插入文档

通过InsertOne函数插入数据。

// 上下文对象,常用用于设置请求超时时间,也可以共用前面创建的上下文对象,不必重新定义。
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 插入文档,这里使用bson.D类型描述JSON文档,bson.D代表一个json数组
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})

// 获取新增文档的id
id := res.InsertedID

需要导入下面包

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

提示:Golang 使用bson包中定义的数据结构表示JSON文档,后面的章节会详细介绍Golang的MongoDB数据存储结构的表达方式。

完整的例子

package main
import (
    "context"
    "fmt"
    "time"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)
func main() {
    // 设置MongoDB连接地址
    uri := "mongodb://root:123456@localhost:27017/admin"
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    // 连接MongoDB
    client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
    if err != nil {
        panic(err)
    }

    defer func() {
        // 延迟释放连接
        if err = client.Disconnect(ctx); err != nil {
            panic(err)
        }
    }()

    // 检测MongoDB是否连接成功
    if err := client.Ping(ctx, readpref.Primary()); err != nil {
        panic(err)
    }
    fmt.Println("MongoDB连接成功!")

    // 获取numbers集合
    collection := client.Database("testing").Collection("numbers")

    // 插入一个文档
    res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
    id := res.InsertedID
    fmt.Println("新增文档Id=", id)
}