【Golang】Golang+Mongodb的牛刀小试

项目简介

简单的Go微服务和Mongodb的示例代码,实现了对用户信息的添加、查询和删除功能。

关于Mongodb

MongoDB是一种文档型数据库,其主要特点是灵活的数据结构和强大的查询功能。它常用于以下场景:

  • 日志存储:MongoDB可以存储大量的日志数据,支持复杂的查询和聚合操作,适合大规模数据的分析和统计。

  • 社交网络:MongoDB的文档型数据结构适合存储社交网络中的用户信息、关系和动态等数据,支持高并发读写操作。

  • 实时数据存储:MongoDB支持高性能的写入操作和实时查询,适合存储实时数据和流数据。

  • IoT数据存储:MongoDB可以存储和查询大量的传感器数据和设备数据,支持地理空间查询和索引。

项目代码

  • main.go
package main

import (
	"log"
	"net/http"

	"github.com/gorilla/mux"
)

func main() {
    
    
	// 连接MongoDB
	err := ConnectDB()
	if err != nil {
    
    
		log.Fatal("MongoDB connection failed: ", err)
	}

	// 创建路由
	r := mux.NewRouter()

	// User路由
	userRouter := r.PathPrefix("/users").Subrouter()
	userRouter.HandleFunc("", CreateUser).Methods("POST")
	userRouter.HandleFunc("", GetUsers).Methods("GET")
	userRouter.HandleFunc("/{id}", GetUserByID).Methods("GET")
	userRouter.HandleFunc("/{id}", UpdateUser).Methods("PUT")
	userRouter.HandleFunc("/{id}", DeleteUserByID).Methods("DELETE")

	// 启动服务器
	log.Fatal(http.ListenAndServe(":8000", r))
}

  • database.go
package main

import (
	"context"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
	"log"
)

var client *mongo.Client

func ConnectDB() error {
    
    
	// 设置连接选项
	clientOptions := options.Client().ApplyURI("mongodb://localhost:27017/")
	// 连接到MongoDB
	var err error
	client, err = mongo.Connect(context.Background(), clientOptions)
	if err != nil {
    
    
		return err
	}

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

	log.Println("Connected to MongoDB!")

	return nil
}


  • user.go
package main

import (
	"context"
	"encoding/json"
	"github.com/gorilla/mux"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"net/http"
	"time"
)

type User struct {
    
    
	ID        string    `json:"id,omitempty" bson:"_id,omitempty"`
	FirstName string    `json:"firstName,omitempty" bson:"firstName,omitempty"`
	LastName  string    `json:"lastName,omitempty" bson:"lastName,omitempty"`
	Email     string    `json:"email,omitempty" bson:"email,omitempty"`
	CreatedAt time.Time `json:"createdAt,omitempty" bson:"createdAt,omitempty"`
}

func CreateUser(w http.ResponseWriter, r *http.Request) {
    
    
	w.Header().Set("Content-Type", "application/json")
	var user User
	err := json.NewDecoder(r.Body).Decode(&user)
	if err != nil {
    
    
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Invalid request payload"})
		return
	}

	collection := client.Database("test").Collection("users")
	user.CreatedAt = time.Now()

	result, err := collection.InsertOne(context.Background(), user)
	if err != nil {
    
    
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Error creating user"})
		return
	}

	w.WriteHeader(http.StatusCreated)
	json.NewEncoder(w).Encode(map[string]string{
    
    "id": result.InsertedID.(primitive.ObjectID).Hex()})

}

func GetUsers(w http.ResponseWriter, r *http.Request) {
    
    
	w.Header().Set("Content-Type", "application/json")
	var users []User
	collection := client.Database("test").Collection("users")

	cursor, err := collection.Find(context.Background(), bson.M{
    
    })
	if err != nil {
    
    
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Error getting users"})
		return
	}

	defer cursor.Close(context.Background())

	for cursor.Next(context.Background()) {
    
    
		var user User
		err := cursor.Decode(&user)
		if err != nil {
    
    
			w.WriteHeader(http.StatusInternalServerError)
			json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Error getting users"})
			return
		}
		users = append(users, user)
	}

	json.NewEncoder(w).Encode(users)
}
func GetUserByID(w http.ResponseWriter, r *http.Request) {
    
    
	w.Header().Set("Content-Type", "application/json")
	params := mux.Vars(r)

	id, _ := primitive.ObjectIDFromHex(params["id"])
	var user User
	collection := client.Database("test").Collection("users")

	err := collection.FindOne(context.Background(), bson.M{
    
    "_id": id}).Decode(&user)
	if err != nil {
    
    
		w.WriteHeader(http.StatusNotFound)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "User not found"})
		return
	}

	json.NewEncoder(w).Encode(user)
}
func UpdateUser(w http.ResponseWriter, r *http.Request) {
    
    
	w.Header().Set("Content-Type", "application/json")
	params := mux.Vars(r)
	id, _ := primitive.ObjectIDFromHex(params["id"])
	var user User
	err := json.NewDecoder(r.Body).Decode(&user)
	if err != nil {
    
    
		w.WriteHeader(http.StatusBadRequest)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Invalid request payload"})
		return
	}

	collection := client.Database("test").Collection("users")
	filter := bson.M{
    
    "_id": id}
	update := bson.M{
    
    "$set": &user}
	result, err := collection.UpdateOne(context.Background(), filter, update)
	if err != nil {
    
    
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Error updating user"})
		return
	}

	if result.MatchedCount == 0 {
    
    
		w.WriteHeader(http.StatusNotFound)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "User not found"})
		return
	}

	w.WriteHeader(http.StatusOK)
	json.NewEncoder(w).Encode(map[string]string{
    
    "message": "User updated successfully"})
}
func DeleteUserByID(w http.ResponseWriter, r *http.Request) {
    
    
	w.Header().Set("Content-Type", "application/json")
	params := mux.Vars(r)
	id, _ := primitive.ObjectIDFromHex(params["id"])
	collection := client.Database("test").Collection("users")

	result, err := collection.DeleteOne(context.Background(), bson.M{
    
    "_id": id})
	if err != nil {
    
    
		w.WriteHeader(http.StatusInternalServerError)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "Error deleting user"})
		return
	}

	if result.DeletedCount == 0 {
    
    
		w.WriteHeader(http.StatusNotFound)
		json.NewEncoder(w).Encode(map[string]string{
    
    "error": "User not found"})
		return
	}

	json.NewEncoder(w).Encode(map[string]string{
    
    "message": "User deleted successfully"})
}

猜你喜欢

转载自blog.csdn.net/linjiuxiansheng/article/details/129807595
今日推荐