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"`
}
其中,字段名需要大写,否则在数据库操作中无法找到该字段。
- 插入文档
使用 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)
- 查找文档
查找一个或多个文档,可以使用 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 迭代器遍历了每个文档。由于该方法返回的是一个迭代器,在使用完毕之后需要关闭迭代器,以避免资源泄漏。
- 更新文档
使用 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 操作符用于递增或递减文档中的字段值。
- 删除文档
使用 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 还提供了更多的方法和选项,例如合并文档、选择返回字段、自定义序列化和反序列化,等等。需要按需使用。