package main

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

// MongoDB 连接池
var MongoDBClient *mongo.Database

// pool 连接池模式
func ConnectToDB() {
    user := "upon_dev"
    password := "Q9fxUzQrEAeVufuZ"
    host := "8.140.132.43"
    port := "27017"
    dbName := "upon_data_dev"
    timeOut := 2
    maxNum := 50

    uri := fmt.Sprintf("mongodb://%s:%s@%s:%s/%s?w=majority", user, password, host, port, dbName)
    // 设置连接超时时间
    ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeOut))
    defer cancel()
    // 通过传进来的uri连接相关的配置
    o := options.Client().ApplyURI(uri)
    // 设置最大连接数 - 默认是100 ,不设置就是最大 max 64
    o.SetMaxPoolSize(uint64(maxNum))
    // 发起链接
    client, err := mongo.Connect(ctx, o)
    if err != nil {
        fmt.Println("ConnectToDB", err)
        return
    }
    // 判断服务是不是可用
    if err = client.Ping(context.Background(), readpref.Primary()); err != nil {
        fmt.Println("ConnectToDB", err)
        return
    }
    // 返回 client
    MongoDBClient = client.Database(dbName)
}

func insert()  {
    ash := Trainer{"18954145016", "123456", []string{"abc1", "efg1", "hij1"}}
    insertResult, err := MongoDBClient.Collection("test").InsertOne(context.TODO(), ash)
    if err != nil {
        fmt.Println(err)
    }
    println("Inserted a single document: ", insertResult.InsertedID)
}

func find()  {
    findOptions := options.Find()
    findOptions.SetLimit(10)
    cur, err := MongoDBClient.Collection("test").Find(context.TODO(), bson.D{{"bssid", "abc1"}}, findOptions)
    if err != nil {
        fmt.Println(err)
    }
    var results []*Trainer
    for cur.Next(context.TODO()) {

        // create a value into which the single document can be decoded
        var elem Trainer
        err := cur.Decode(&elem)
        if err != nil {
            fmt.Println(err)
        }

        results = append(results, &elem)
    }

    if err := cur.Err(); err != nil {
        fmt.Println(err)
    }

    for _, v := range results {
        fmt.Println(v.Phone)
    }
}

type Trainer struct {
    Phone string
    Imei  string
    Bssid  []string
}

func main() {
    ConnectToDB()
    insert()
    find()
}
// find混合条件查询
func find() {
    findOptions := options.Find()
    findOptions.SetLimit(10)
    var mem service.Member
    mem.Bssid = []string{"a"}
    mem.Address = []string{"c"}
    //filter := bson.D{{"bssid", bson.D{{"$in", bson.A{"a"}}}}}
    //filter := bson.D{{"$or", bson.A{
    //	bson.D{{"bssid", bson.D{{"$in", mem.Bssid}}}},
    //	bson.D{{"address", bson.D{{"$in", mem.Address}}}},
    //}}}
    //filter := bson.D{{
    //	"gender", bson.D{{"$in", bson.A{1,2}}},
    //}}
    filter := bson.D{{
        "$and", bson.A{
            bson.D{{
                "gender", bson.D{{"$in", bson.A{1,2}}},
            }},
            bson.D{{"$or", bson.A{
                bson.D{{"bssid", bson.D{{"$in", mem.Bssid}}}},
                bson.D{{"address", bson.D{{"$in", mem.Address}}}},
            }}},
        },
    }}
    cur, err := MongoDBClient.Collection("da_member").Find(context.TODO(), filter, findOptions)
    if err != nil {
        fmt.Println(err)
    }
    if err = cur.Err(); err != nil {
        fmt.Println(err)
    }
    var results []*service.Member
    err = cur.All(context.TODO(), &results)
    if err != nil {
        fmt.Println(err)
    }
    for _, v := range results {
        fmt.Println(*v.Mobile)
    }
}