Go操作MongoDB
前言:我们知道数据库是用来存储我们的数据的,但是数据库同样需要我们来管理,这里我们来介绍一下如何使用Go语言来对MongoDB进行操作
一、Go连接MongoDB端口
首先我们需要让go连接MongoDB端口,我们可以这样做:
这是我的文件目录结构
在main中:
func main() {
c := context.Background()
//连接MongoDB端口
/*
Connect 创建一个新的客户端,然后使用 Connect 方法对其进行初始化。 这相当于调用 NewClient,然后调用 Client.Connect。
*/
mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar"))
if err != nil {
panic(err) //这里就不具体但进行错误处理了
}
//连入MongoDB中的数据库coolcar中的account
col := mc.Database("coolcar").Collection("account")
这样我们就成功连接上了MongoDB端口,并且可以对coolcar中的account进行操作了
下面来写两个函数来操作数据库:
//向数据库写入数据
func insertRows(c context.Context, col *mongo.Collection) {
res, err := col.InsertMany(c, []interface{}{ //向数据库中写入数据
bson.M{
"open_id": "001",
},
bson.M{
"open_id": "002",
},
bson.M{
"open_id": "003",
},
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", res)
}
我们在main()中调用:
func main() {
c := context.Background()
//连接MongoDB端口
/*
Connect 创建一个新的客户端,然后使用 Connect 方法对其进行初始化。 这相当于调用 NewClient,然后调用 Client.Connect。
*/
mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar"))
if err != nil {
panic(err) //这里就不具体但进行错误处理了
}
//连入MongoDB中的数据库coolcar中的account
col := mc.Database("coolcar").Collection("account")
//调用函数
insertRows(c, col)
打印结果:(数据就已经写入数据库了)
&{InsertedIDs:[ObjectID("6232caa11b0ff048aabc3808") ObjectID("6232caa11b0ff048aabc3809") ObjectID("6232caa11b0ff048aabc380a")]}
打开数据库我们可以看到:
接下来再来写一个查找数据库的函数:
func findRows(c context.Context, col *mongo.Collection) {
cur, err := col.Find(c, bson.M{})
if err != nil {
panic(err)
}
for cur.Next(c) {
var row struct {
ID primitive.ObjectID `bson:"_id"`
OpenID string `bson:"open_id"`
}
err = cur.Decode(&row)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", row)
}
}
这里我们还是来了解一下对应的方法:
col.Find(c, bson.M{})
函数声明:
func (*mongo.Collection).Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error)
Find 执行 find 命令并返回集合中匹配文档的 Cursor。 filter 参数必须是包含查询运算符的文档,并且可用于选择结果中包含哪些文档。 它不能为零。 应使用空文档(例如 bson.D{})来包含所有文档。
cur.Next(c)
函数声明:
func (*mongo.Cursor).Next(ctx context.Context) bool
Next 获取此游标的下一个文档。 如果没有错误并且游标没有耗尽,则返回 true。 Next 阻塞,直到文档可用、发生错误或 ctx 过期。 如果 ctx 过期,错误将被设置为 ctx.Err()。 在错误情况下,Next 将返回 false。 如果 Next 返回 false,则后续调用也将返回 false。
cur.Decode(&row)
函数声明:
func (*mongo.Cursor).Decode(val interface{}) error
Decode 会将当前文档解组为 val 并返回解组过程中的任何错误而不进行任何修改。 如果 val 为 nil 或类型为 nil,则会返回错误。
调用此函数打印结果:
{ID:ObjectID("623186a83dbbceb3de249c40") OpenID:123}
{ID:ObjectID("623186a83dbbceb3de249c41") OpenID:456}
{ID:ObjectID("62319fb5238127d009269726") OpenID:olSZV5QLR587RJZCV8OB-29qdR4Q}
panic: error decoding key _id: an ObjectID string must be exactly 12 bytes long (got 2)
```当然该数据库中还有其他数据,因为ObjectID的原因,程序panic了```
本作品采用《CC 协议》,转载必须注明作者和本文链接