Golang 对 MongoDB 增删改查的封装和使用示范

77 min read

Golang 对 MongoDB 的操作比较方便,官方提供了 mongo-go-driver 这个包来操作 MongoDB,可以通过它来完成增删改查。

下面是一个简单的示范,假设我们已经有了一个名为“test”的数据库,其中有一个名为“users”的集合。在 Golang 中,它可以用以下代码来进行连接:

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

func main() {
    // 连接 MongoDB
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        panic(err)
    }

    // 检查连接
    err = client.Ping(context.Background(), nil)
    if err != nil {
        panic(err)
    }

    fmt.Println("Successfully connected!")
}

接下来,我们可以使用该客户端对数据库进行增删改查的操作。使用 mongo-go-driver 对 MongoDB 进行操作需要用到两个包:bson 和 mongo。

在下面示范的所有代码中,我们将使用一个名为“User”的结构体来表示 users 集合中的一个文档。

type User struct {
    ID       primitive.ObjectID `bson:"_id,omitempty"`
    Name     string             `bson:"name,omitempty"`
    Age      int                `bson:"age,omitempty"`
    Location string             `bson:"location,omitempty"`
}

其中,字段名需要大写,否则在数据库操作中无法找到该字段。

  1. 插入文档

使用 mongo-go-driver 插入文档,可以使用 mongo.Collection.InsertOne 或 mongo.Collection.InsertMany 方法。InsertOne 可以插入一个文档,InsertMany 可以同时插入多个文档。下面是一个示例,演示如何使用 InsertOne 方法来插入一个文档:

user := User{Name: "Tom", Age: 20, Location: "Los Angeles"}
collection := client.Database("test").Collection("users")
res, err := collection.InsertOne(context.Background(), &user)
if err != nil {
    panic(err)
}
fmt.Println("Inserted id:", res.InsertedID)
  1. 查找文档

查找一个或多个文档,可以使用 Find 方法。以下是一个示例,演示如何使用 Find 方法来查找多个文档:

collection := client.Database("test").Collection("users")
cursor, err := collection.Find(context.Background(), bson.M{})
if err != nil {
    panic(err)
}
defer cursor.Close(context.Background())
users := make([]User, 0)
for cursor.Next(context.Background()) {
    var user User
    err = cursor.Decode(&user)
    if err != nil {
        panic(err)
    }

    users = append(users, user)
}
if err := cursor.Err(); err != nil {
    panic(err)
}
fmt.Println(users)

在上面的代码中,我们获取了 users 集合中的所有文档,并通过 cursor 迭代器遍历了每个文档。由于该方法返回的是一个迭代器,在使用完毕之后需要关闭迭代器,以避免资源泄漏。

  1. 更新文档

使用 mongo-go-driver 更新文档可以使用 mongo.Collection.UpdateOne 或 mongo.Collection.UpdateMany 方法。UpdateOne 可以更新一个文档,UpdateMany 可以同时更新多个文档。

下面是一个示例,演示如何使用 UpdateOne 方法来更新一个文档:

filter := bson.D{{"name", "Tom"}}
update := bson.D{
    {"$inc", bson.D{
        {"age", 1},
    }},
}
res, err := collection.UpdateOne(context.Background(), filter, update)
if err != nil {
    panic(err)
}
fmt.Printf("Matched %v documents and updated %v documents.\n", res.MatchedCount, res.ModifiedCount)

在上面的代码中,我们使用 bson.D 来表示文档过滤条件和更新操作。$inc 操作符用于递增或递减文档中的字段值。

  1. 删除文档

使用 mongo-go-driver 删除文档可以使用 mongo.Collection.DeleteOne 或 mongo.Collection.DeleteMany 方法。DeleteOne 可以删除一个文档,DeleteMany 可以同时删除多个文档。

以下是一个示例,演示如何使用 DeleteOne 方法来删除一个文档:

filter := bson.D{{"name", "Tom"}}
res, err := collection.DeleteOne(context.Background(), filter)
if err != nil {
    panic(err)
}
fmt.Printf("Deleted %v documents.\n", res.DeletedCount)

在上面的代码中,我们使用 bson.D 来表示文档过滤条件。

综上所述,以上示例是使用 mongo-go-driver 对 MongoDB 进行 CRUD 操作的基本流程。实际上,mongo-go-driver 还提供了更多的方法和选项,例如合并文档、选择返回字段、自定义序列化和反序列化,等等。需要按需使用。