MongoDB Go Driver使用帮助文档

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 正式的MongoDB Go Driver近来变成1.0的GA版本。它现在被认为是一个完整的特性, 并且准备好在正式产品中使用。这篇使用说明书将帮助你开始使用 MongoDB Go Driver。你将会创建一个简单的程序并且学到如何:安装MongoDB Go Driver使用Go Driver来连接MongoDB在Go内使用BSON对象给MongoDB发送CRUD操作你可以在github代码仓库看到这篇帮助文档的完整代码。为了可以按步骤进行, 你需要一个MongoDB数据库来连接, 你可以使用一个运行在本地的MongoDB数据库, 或者很容易地使用MongoDB Atlas来创建一个

正式的MongoDB Go Driver近来变成1.0的GA版本。它现在被认为是一个完整的特性, 并且准备好在正式产品中使用。这篇使用说明书将帮助你开始使用 MongoDB Go Driver。你将会创建一个简单的程序并且学到如何:

安装MongoDB Go Driver
使用Go Driver来连接MongoDB
在Go内使用BSON对象
给MongoDB发送CRUD操作
你可以在github代码仓库看到这篇帮助文档的完整代码。为了可以按步骤进行, 你需要一个MongoDB数据库来连接, 你可以使用一个运行在本地的MongoDB数据库, 或者很容易地使用MongoDB Atlas来创建一个500M的数据库。

安装MongoDB Go Driver
MongoDB Go Driver有几个代码包组成, 如果你正在使用go get工具, 你可使用如下命令安装:

go get go.mongodb.org/mongo-driver
这个命令的输出可能看起来像一个告警信息:package go.mongodb。org/mongo-driver: no Go files in (…)。这是go get的预期输出。

如果你正在使用dep package manager, 你可以用如下的命令安装mongo主程序包, 以及bson包和mongo/options包:

dep ensure --add go.mongodb。org/mongo-driver/mongo \
go.mongodb。org/mongo-driver/bson \
go.mongodb。org/mongo-driver/mongo/options
如果你正在使用go mod, 正确的代码包会在构建的时候获取到。

创建框架
创建main.go文件并且import bson, mongo, and mongo/options包:

package main

import (

"context"
"fmt"
"log"

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

)

// You will be using this Trainer type later in the program
type Trainer struct {

Name string
Age  int
City string

}

func main() {

// Rest of the code will go here

}
这段代码也import几个标准库, 并且定义了一个Trainer类型, 在后面的帮助文档中你会用到它们。

使用Go Driver连接到MongoDB
一旦MongoDB Go Driver被import, 你可以使用mongo.Connect()来连接到一个MongoDB部署,你必须要传递一个context和一个options.ClientOptions对象给mongo.Connect()。这些client options被用来设置连接字符串, 它也被用来配置driver的设定, 比如write concern, socket timeout等等。options包文档有更多可用的client options信息。

添加下面的代码到main函数里面:

// Set client options
clientOptions := options.Client().ApplyURI("mongodb:localhost:27017")

// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)

if err != nil {

log.Fatal(err)

}

// Check the connection
err = client.Ping(context.TODO(), nil)

if err != nil {

log.Fatal(err)

}

fmt.Println("Connected to MongoDB!")
一旦连接成功, 你可以通过将如下这行代码添加到main函数最后面来获得在test库里面Trainer集合的handle:

collection := client.Database("test").Collection("trainers")
下面的代码会使用该集合的handle来查询trainers集合。

最好的实践是保存一个连接到MongoDB的client一段时间,以便应用程序可以利用连接池—-你不会希望每次查询打开和关闭一个链接。然而, 如果你的应用程序不再需要一个连接, 该连接可以使用client.Disconnect()被关闭,像这样:

err = client.Disconnect(context.TODO())

if err != nil {

log.Fatal(err)

}
fmt.Println("Connection to MongoDB closed.")
运行代码来测试一下你的程序能成功的连接到MongoDB服务器。Go 会对没有使用的bson和mongo/options包, 以及没有使用的集合变量报警,因为我们还没有使用它们做任何事情。 你必须要注释掉它们直到它们被你的程序使用到, 然后来测试连接。

在Go中使用BSON对象
在我们发送查询给数据库之前, 很重要的一点是,理解Go Driver是如何和BSON对象协同工作的。JSON文档在MongoDB里面以二进制形式存储, 被称作BSON(二进制编码的JSON)。不像其他的数据库保存JSON数据为简单的字符串和数字, BSON扩展了JSON的保存形式, 包括额外的类型, 比如int, long, date, floating point以及decimal128。这使得它让应用程序更容易来可靠地处理、排序和比较数据。Go Driver有两个系列的类型表示BSON数据:D系列类型和Raw系列类型。

D系列的类型使用原生的Go类型简单地构建BSON对象。这可以非常有用的来创建传递给MongoDB的命令。 D系列包含4种类型:

  • D:一个BSON文档。这个类型应该被用在顺序很重要的场景, 比如MongoDB命令。
  • M: 一个无需map。 它和D是一样的, 除了它不保留顺序。
  • A: 一个BSON数组。
  • E: 在D里面的一个单一的子项。

这里有一个使用D类型构建的过滤文档的例子, 它可能被用在查询name字段匹配“Alice”或者“Bob”的文档:

bson.D{{

"name", 
bson.D{{
    "$in", 
    bson.A{"Alice", "Bob"}
}}

}}
Raw系列类型被用来验证bytes类型的slice, 你也可以从Raw类型使用Lookup()获得单个的子项, 这在你不想要unmarshall某个BSON到另一个类型的时候很有用。这篇买游戏账号平台帮助文档会只使用D系列类型。

CRUD操作
一旦你已经连接到一个数据库, 是时候添加和操作一些数据了。集合类型有一些函数允许你给数据库发送查询。

插入文档
首先, 创建一些Trainer结构体用来插入到数据库:

ash := Trainer{"Ash", 10, "Pallet Town"}
misty := Trainer{"Misty", 10, "Cerulean City"}
brock := Trainer{"Brock", 15, "Pewter City"}
要插入一个单独的文档, 使用 collection.InsertOne()函数:

insertResult, err := collection.InsertOne(context.TODO(), ash)
if err != nil {

log.Fatal(err)

}

fmt.Println("Inserted a single document: ", insertResult.InsertedID)
要同时插入多个文档, collection.InsertMany() 函数会采用一个slice对象:

trainers := []interface{}{misty, brock}

insertManyResult, err := collection.InsertMany(context.TODO(), trainers)
if err != nil {

log.Fatal(err)

}

fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
更新文档
collection.UpdateOne()函数允许你更新单一的文档, 它需要一个filter文档来匹配数据库里面的文档, 并且需要一个update文档来描述更新的操作。你可以用bson.D类型来构建这些文档:

filter := bson.D{{"name", "Ash"}}

update := bson.D{

{"$inc", bson.D{
    {"age", 1},
}},

}
这段代码会匹配name是“Ash”的文档, 并且将Ash的age增加1 —生日快乐, Ash!

updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {

log.Fatal(err)

}

fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {

log.Fatal(err)

}

fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
查找文档
要查询一个文档, 你需要一个filter文档, 以及一个指针在它里边保存结果的解码。要查询单个的文档, 使用collection.FindOne()函数。这个函数返回单个的结果,被解码成为一个值。你可以使用和上面使用过的update查询一样的filter变量来匹配一个name是Ash的文档。

// create a value into which the result can be decoded
var result Trainer

err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {

log.Fatal(err)

}

fmt.Printf("Found a single document: %+v\n", result)
要查询多个文档, 使用collection.Find(),这个函数返回一个游标。一个游标提供一个文档流, 通过它你可以遍历和解码每一个文档。一旦一个游标被消耗掉, 你应该关闭游标。这里你也可以使用options包来设定一些操作选项, 特别的, 你可以设定一个返回文档数量的限制, 比如2个。

// Pass these options to the Find method
findOptions := options.Find()
findOptions.SetLimit(2)

// Here's an array in which you can store the decoded documents
var results []*Trainer

// Passing bson.D{{}} as the filter matches all documents in the collection
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {

log.Fatal(err)

}

// Finding multiple documents returns a cursor
// Iterating through the cursor allows us to decode documents one at a time
for cur.Next(context.TODO()) {

// create a value into which the single document can be decoded
var elem Trainer
err := cur.Decode(&elem)
if err != nil {
    log.Fatal(err)
}

results = append(results, &elem)

}

if err := cur.Err(); err != nil {

log.Fatal(err)

}

// Close the cursor once finished
cur.Close(context.TODO())

fmt.Printf("Found multiple documents (array of pointers): %+v\n", results)
删除文档
最后, 你可以使用collection.DeleteOne() 或者 collection.DeleteMany()来删除文档。这里, 你传递bson.D{{}}作为filter参数, 这会匹配集合内所有的文档。 你也可以使用collection.Drop()来删除整个集合。

deleteResult, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {

log.Fatal(err)

}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
接下来步骤
你可以在Github 代码仓库看到这篇帮助文档的最终的代码。MongoDB Go Driver 的文档能从GoDoc获得。
你可能会对使用aggregations或者transaction特别感兴趣。

如果你有任何问题, 请联系mongo-go-driver Google group。关于Go 项目任何的bug,请编辑一个MongoDB JIRA, 我们很喜欢你能够有Go Driver的反馈, 因此请联系我们并且让我们知道你的想法。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
5月前
|
存储 NoSQL Go
Go、MongoDB
【6月更文挑战第5天】
57 7
|
NoSQL 数据可视化 Ubuntu
一文便知 GO 中mongodb 的安装与使用
咱们来回顾一下上次分享的内容: • 如何使用log 包 • log 包原理和具体实现 • 自定义日志
365 0
|
3月前
|
存储 NoSQL Go
Go 使用 MongoDB
Go 使用 MongoDB
32 8
|
3月前
|
人工智能 NoSQL Go
Go MongoDB Driver 实例
Go MongoDB Driver 实例
20 1
|
3月前
|
人工智能 JSON NoSQL
Go MongoDB Driver 中的 A D M E 类型是什么
Go MongoDB Driver 中的 A D M E 类型是什么
36 1
|
6月前
|
存储 NoSQL Go
【Go语言专栏】Go语言中的MongoDB操作与NoSQL应用
【4月更文挑战第30天】本文介绍了Go语言中操作MongoDB的方法和NoSQL应用的优势。MongoDB作为流行的NoSQL数据库,以其文档型数据模型、高性能和可扩展性被广泛应用。在Go语言中,通过mongo-go-driver库可轻松实现与MongoDB的连接及插入、查询、更新和删除等操作。MongoDB在NoSQL应用中的优点包括灵活的数据模型、高性能、高可用性和易于扩展,使其成为处理大规模数据和高并发场景的理想选择。
64 0
|
6月前
|
存储 NoSQL 安全
go 连接mongodb执行查询的代码
在Go语言中,你可以使用官方的MongoDB驱动程序 `"go.mongodb.org/mongo-driver/mongo"` 来连接MongoDB并执行查询。以下是一个简单的示例代码,演示如何连接MongoDB并执行查询: 首先,确保你已经安装了MongoDB驱动程序: ```bash go get go.mongodb.org/mongo-driver/mongo ``` 然后,可以使用以下示例代码: ```go package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driv
117 0
|
NoSQL Go MongoDB
Go --- 简单操作MongoDB
Go --- 简单操作MongoDB
|
NoSQL Go MongoDB
go mongodb 忽略字段,go bson 忽略字段
go mongodb 忽略字段,go bson 忽略字段
1155 0
|
2天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
下一篇
无影云桌面