项目简介
简单的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"})
}