我使用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方法来创建新记录。
我会立即注册试试。
返回的响应包含了文档的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请求时
刚刚发送的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方法发出请求即可删除文档。
暂且通过GET验证一下
文档已被有效删除。
最后
这次非常简单,但将来我希望能更加熟悉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