我使用Go语言和MongoDB创建了一个管理无模式数据的API

首先

你好 (nǐ

因为迫切需要,我有机会接触到一种名为MongoDB的文档型数据库,所以现在(才)分享。

我想使用Go语言为例,在MongoDB上创建一个简单的API。

与MongoDB的连接

驱动程序的安装

由于MongoDB采用了自己的协议,所以需要使用驱动程序。

※这次我们决定从星级评价上选择这位司机来使用。
https://github.com/mongodb/mongo-go-driver

※本文只需要一种选项:
※具体的导入方法已在上一篇文章中做了大致的说明。

使用Go语言进行连接

这里是必需的包裹。

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

这段代码只需要两行就能完成。

    clientOptions := options.Client().ApplyURI("mongodb://db")
    client, _ := mongo.Connect(context.TODO(), clientOptions)

在使用docker-compose的情况下,”db”是ApplyURI()函数的参数,它代表了host。

    • docker-compose.yml

https://github.com/leica19/go-mongo-sample-api/blob/master/docker-compose.yml

当把它变得更具外观并函数化时

func ConnectMongoDB() *mongo.Client {
    clientOptions := options.Client().ApplyURI("mongodb://db")
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }
    return client
}

这个样子对吗?

创建收藏品

接下来需要创建一个集合。
※集合是指文档的集合单位。

可以使用mongo.Client的Collection方法来创建集合。
它将返回mongo.Collection的处理程序作为返回值。
※未来主要将使用该处理程序来操作集合。

    collection := client.Database("test").Collection("users")

这次我正在创建一个名为”users”的集合。

新建文档

我們將通過POST的端點來向用戶集合中新增一個新的文檔。
我們將使JSON能夠透過POST來傳送。

以下提到的是路由和处理程序。

    e.POST("/user", func(c echo.Context) error {
        jsonBody := echo.Map{}
        if err := c.Bind(&jsonBody); err != nil {
            errorResponse := ErrorResponse{Message: "Bad Request"}
            return c.JSON(http.StatusBadRequest, errorResponse)
        }
        result, _ := collection.InsertOne(context.TODO(), jsonBody)
        response := Response{ID: result.InsertedID}
        return c.JSON(http.StatusOK, response)
    })

我们使用c.Bind()将请求的Body参数映射到Go语言的map中。
※我们使用Echo作为Web框架。https://echo.labstack.com/guide
我们使用InsertOne方法来创建新记录。

我会立即注册试试。

Screenshot from 2019-08-24 18-17-57.png

返回的响应包含了文档的ID,即ObjectId。

文档的查阅

接下来,我们将使用GET请求来确认刚刚注册的文档是否已经成功注册。

从处理程序中

    e.GET("/user/:_id", func(c echo.Context) error {
        raw_id := c.Param("_id")
        _id, _ := primitive.ObjectIDFromHex(raw_id)
        result := echo.Map{}
        if err := collection.FindOne(context.TODO(), bson.M{"_id": _id}).Decode(&result); err != nil {
            errorResponse := ErrorResponse{Message: "Not Found"}
            return c.JSON(http.StatusNotFound, errorResponse)
        }
        return c.JSON(http.StatusOK, result)
    })

重要的是要使用`primitive`包中的`ObjectIDFromHex`函数,在一个十六进制的字符串传入之后将其转换为正确的ObjectId。对于内部的细节不太清楚,抱歉。

当将ObjectId作为请求路径中的参数,并进行GET请求时

Screenshot from 2019-08-24 18-18-11.png

刚刚发送的JSON正确地返回了。

删除文件

最後是删除。

没有特别引人注目的地方,但处理程序

    e.DELETE("/user/:_id", func(c echo.Context) error {
        raw_id := c.Param("_id")
        _id, _ := primitive.ObjectIDFromHex(raw_id)
        result, _ := collection.DeleteOne(context.TODO(), bson.M{"_id": _id})
        return c.JSON(http.StatusOK, result)
    })

由于这只是临时实现,所以将DeleteOne方法的返回值直接作为响应返回。
通过在请求路径中添加ObjectId,并使用DELETE方法发出请求即可删除文档。

Screenshot from 2019-08-24 18-18-22.png

暂且通过GET验证一下

Screenshot from 2019-08-24 18-18-29.png

文档已被有效删除。

最后

这次非常简单,但将来我希望能更加熟悉Mongo的查询,不是吗?

感谢您的阅读。

我们在这里发布了本次的源代码。
https://github.com/leica19/go-mongo-sample-api

请参阅

MongoDB公式チュートリアル

https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial

公式APIドキュメント

https://godoc.org/go.mongodb.org/mongo-driver/mongo

广告
将在 10 秒后关闭
bannerAds