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) } }