Golang操作MongoDB:mongo-driver

这篇文章主要介绍了使用GO操作MongoDB,包括安装MongoDB驱动程序连接mongodb的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.安装 MongoDB Go 驱动程序

MongoDB Go Driver 由几个包组成。如果您只是使用 go get,则可以使用以下命令安装驱动程序:

go get github.com/mongodb/mongo-go-driver

这个输出可能看起来像一个警告,说明类似于 package github.com/mongodb/mongo-go-driver: no Go files in (…)。这是预期的输出。

如果您使用 govendor 包管理器,则需要使用以下命令安装主 mongo 包以及 bson 和 mongo/options 包:

govendor fetch github.com/mongodb/mongo-go-driver/mongo

govendor fetch go.mongodb.org/mongo-driver/bson

govendor fetch go.mongodb.org/mongo-driver/mongo/options

2.设置连接

导入 MongoDB Go 驱动程序后,我们可以使用 Client.Connect(context) 连接到 MongoDB 部署。我们需要设置一个新客户端,我们需要在设置客户端时传递 mongo 数据库的 URI。然后我们只需要使用上下文调用 client.Connect(context),这将建立我们的连接。

以下代码为我们建立了一个连接:

//Set up a context required by mongo.Connect
ctx, cancel := context.WithTimeout(context.Background(), 10\*time.Second)

//To close the connection at the end
defer cancel()

//We need to set up a client first
//It takes the URI of your database
client, error := mongo.NewClient(options.Client().ApplyURI("your\_database\_uri"))

if error != nil {
 log.Fatal(err)
}

//Call the connect function of client
error = client.Connect(ctx)

//Checking the connection
error = client.Ping(context.TODO(), nil)
fmt.Println("Database connected")

3.在 Go 中使用 BSON 对象

MongoDB 中的 JSON 文档存储在称为 BSON(二进制编码 JSON)的二进制表示中。与将 JSON 数据存储为简单字符串和数字的其他数据库不同,BSON 编码扩展了 JSON 表示以包括其他类型,例如 int、long、date、floating point 和 decimal128。这使得应用程序更容易可靠地处理、排序和比较数据。 Go Driver 有两个表示 BSON 数据的类型:D 类型和 Raw 类型。

D 系列类型用于使用本机 Go 类型简洁地构建 BSON 对象。这对于构造传递给 MongoDB 的命令特别有用。 D 系列包括四种类型:

  • D:BSON 文档。这种类型应该在顺序很重要的情况下使用,例如 MongoDB 命令。
  • M:无序映射。它与 D 相同,只是它不保持顺序。
  • A:一个 BSON 数组。
  • E:D 中的单个元素。

这是一个使用 D 类型构建的过滤器文档的示例,可用于查找名称字段与 Alice 或 Bob 匹配的文档:

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

4. CRUD 操作

对于 CRUD 和其他操作,我们需要使用集合对象,我们可以通过引用数据库中各自的集合来创建它,例如:

BooksCollection := client.Database("test").Collection("books")

插入
对于创建,我们可以将 collection.InsertOne() 用于单个条目,也可以使用 collection.InsertMany() 来接收对象切片。

/\*\*
\* Create - Adding a new book
\* res -\> the insert command returns the inserted id of the oject
\*/

res, err := BooksCollection.InsertOne(ctx, bson.M{"name": "The Go Language", "genre": "Coding", "authorId": "4"})

if err != nil {
log.Fatal(err)
}

在 collection.InsertOne() 中,我们可以通过 bson.M{} 传递一个字符串对象,或者我们可以创建一个我们各自类型结构的对象并传递该对象。

阅读
为了查找文档,我们需要一个过滤文档以及一个指向可以将结果解码成的值的指针。要查找单个文档,请使用 collection.FindOne()。此方法返回一个可以解码为值的结果。过滤器对象指定我们要查找的内容。

filter := bson.D{{"name", "Book 1"}}

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

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

fmt.Printf("Found a single Book: %+v\n", result)

要查找多个文档,请使用 collection.Find()。此方法返回一个光标。游标提供了一个文档流,我们可以通过它一次迭代和解码一个。一旦游标用尽,我们应该关闭游标。

cur, error := BooksCollection.Find(ctx, bson.D{{}})

var allbooks []\*bookType

//Loops over the cursor stream and appends to result array
for cur.Next(context.TODO()) {
var booksResultHolder bookType

err := cur.Decode(&bookResultHolder)

if err != nil {
log.Fatal(err)
}

allbooks = append(allbooks, &booksResultHolder)
}

//dont forget to close the cursor
defer cur.Close(context.TODO())

// Loop over the result array and perform whatever required
for \_, element := range allbooks {
book := \*element
fmt.Println(book)
}

更新
collection.UpdateOne() 方法允许您更新单个文档。它需要一个过滤文档来匹配数据库中的文档,并需要一个更新文档来描述更新操作。这些可以按照我们在阅读时制作过滤器对象的方式构建。

/\*\*
\* Update
\* Collection has functions like UpdateOne and UpdateMany
\* Returns the Matched and Modified Count
\*/

filter := bson.D{{"name", "Book 1"}}

// Need to specify the mongodb output operator too
newName := bson.D{
{"$set", bson.D{
{"name", "Updated Name of Book 1"},
}},
}

res, err := BooksCollection.UpdateOne(ctx, filter, newName)

if err != nil {
log.Fatal(err)
}

updatedObject := \*res

fmt.Printf("The matched count is : %d, the modified count is : %d", updatedObject.MatchedCount, updatedObject.ModifiedCount)

删除
最后,我们可以使用 collection.DeleteOne() 或 collection.DeleteMany() 删除文档。在这里,我们可以传递 nil 作为过滤器参数,它将匹配集合中的所有文档或任何其他特定参数。我们还可以使用collection.Drop()删除整个集合。

filter = bson.D{{"name", "Updated Name of Book 2"}}

deleteResult, error := BooksCollection.DeleteOne(ctx, filter)

后续步骤
本教程的源代码可以在这里找到。

MongoDB Go 驱动程序的文档可在GoDoc上找到。您可能对有关使用聚合或交易的文档特别感兴趣。

希望本教程对您来说更简单,祝大家编码愉快!