package main

import (
	"context"
	"encoding/json"
	"fmt"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.uber.org/zap"
	"log"
	"os"
)

// 创建一个文件用于日志输出
func logFile() *os.File {
	file, err := os.Create("logfile.log")
	if err != nil {
		log.Fatal("Error creating log file: ", err)
	}
	return file
}

func main() {

	zap.S().Infof("hello world")

	// 设置MongoDB连接选项
	clientOptions := options.Client().ApplyURI("mongodb://120.46.150.226:27277").SetAuth(options.Credential{
		Username: "root",
		Password: "root",
	})

	// 连接到MongoDB
	client, err := mongo.Connect(context.TODO(), clientOptions)
	if err != nil {
		zap.S().Infof("err: %v", err)
	}

	// 检查连接
	err = client.Ping(context.TODO(), nil)
	if err != nil {
		zap.S().Infof("err: %v", err)
	}

	zap.S().Infof("Connected to MongoDB!")

	// 获取对特定数据库和集合的引用
	collection := client.Database("mydatabase").Collection("mycollection")

	collection.Indexes()
	// 插入文档
	insertResult, err := collection.InsertOne(context.TODO(), map[string]interface{}{
		"title":       "MongoDB 教程",
		"description": "MongoDB 是一个 Nosql 数据库",
		"by":          "菜鸟教程",
		"url":         "http://www.runoob.com",
		"tags":        "['mongodb', 'database', 'NoSQL']",
		"likes":       100,
	})
	if err != nil {
		zap.S().Infof("err: %v", err)
	}

	zap.S().Infof("Inserted a single document: %v", insertResult.InsertedID)

	// 查询文档
	re, err := collection.Find(context.TODO(), map[string]interface{}{"title": "MongoDB 教程"}, options.Find().SetLimit(10).SetSkip(1).SetSort(1))
	if err != nil {
		zap.S().Infof("err: %v", err)
	}
	marshal, err := json.Marshal(re)
	fmt.Println("Found document:", string(marshal))

	/*// 更新文档
	updateResult, err := collection.UpdateOne(
		context.TODO(),
		map[string]interface{}{"title": "MongoDB 教程"},
		marshal,
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Matched %v document and modified %v document(s)\n", updateResult.MatchedCount, updateResult.ModifiedCount)*/

	// 删除文档
	deleteResult, err := collection.DeleteMany(context.TODO(), map[string]interface{}{"title": "MongoDB 教程"})
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Deleted %v document\n", deleteResult.DeletedCount)

	// 断开连接
	err = client.Disconnect(context.TODO())
	if err != nil {
		zap.S().Infof("err: %v", err)
	}
	fmt.Println("Connection to MongoDB closed.")
}
