ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> # MongoDB - 概念 - 数据库 - 集合 - 文档 ~~~ package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 设置 MongoDB 连接选项 clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatal(err) } // 检查连接是否正常 err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } fmt.Println("Connected to MongoDB!") // 选择要操作的数据库和集合 collection := client.Database("testdb").Collection("testcollection") /* // 插入文档(单个) insertDoc := bson.D{ {Key: "name", Value: "John"}, {Key: "age", Value: 30}, {Key: "city", Value: "New York"}, } */ /* //插入文档(多个) insertDoc := []interface{}{ bson.D{ {Key: "name", Value: "Test1"}, {Key: "age", Value: 30}, }, bson.D{ {Key: "name", Value: "Test2"}, {Key: "age", Value: 25}, }, } _, err = collection.InsertMany(context.TODO(), insertDoc) if err != nil { log.Fatal(err) } */ /* // 查询文档(单个) var result bson.M //设置查询过滤条件 filter := bson.D{{"name", "Test1"}} err = collection.FindOne(context.TODO(), filter).Decode(&result) if err != nil { log.Fatal(err) } fmt.Println("Found document:", result) */ /* // 查询文档(多个) type Person struct { Name string Age int } // 构建正则表达式来进行模糊搜索 regexPattern := "1.*" // 这里使用 "John" 开头的字符串作为模糊搜索的示例 // 创建正则表达式 regex := primitive.Regex{Pattern: regexPattern, Options: "i"} // "i" 表示不区分大小写 // 设置查询过滤条件(查询年龄大于等于 >=25 && <= 100 岁 的文档) filter := bson.D{ {"name", bson.M{"$regex": regex}}, // 设置查询条件,使用正则表达式匹配名字字段 {"age", bson.D{{"$gte", 25}, {"$lte", 100}}}, } // 设置排序条件,按年龄升序排列 options := options.Find() options.SetSort(bson.D{{"age", 1}}) //1 表示升序,-1 表示降序 // 设置结果数量限制 options.SetLimit(10) // 这里限制结果数量为 10 // 执行查询 cur, err := collection.Find(context.TODO(), filter, options) if err != nil { log.Fatal(err) } defer cur.Close(context.TODO()) // 使用切片的指针来存储查询结果 var results []Person // 遍历查询结果并解码 for cur.Next(context.TODO()) { var result Person err := cur.Decode(&result) if err != nil { log.Fatal(err) } results = append(results, result) } if err := cur.Err(); err != nil { log.Fatal(err) } */ /* // 更新文档 filter := bson.D{{"name", "Test1"}} update := bson.D{ {"$set", bson.D{{"age", 55}}}, } updateResult, err := collection.UpdateMany(context.TODO(), filter, update) if err != nil { log.Fatal(err) } fmt.Printf("Matched %v documents and modified %v documents\n", updateResult.MatchedCount, updateResult.ModifiedCount) */ // 删除文档 filter := bson.D{{"name", "Test1"}} deleteResult, err := collection.DeleteMany(context.TODO(), filter) if err != nil { log.Fatal(err) } fmt.Printf("Deleted %v documents in the collection\n", deleteResult.DeletedCount) // 断开连接 err = client.Disconnect(context.TODO()) if err != nil { log.Fatal(err) } fmt.Println("Connection to MongoDB closed.") // 等待一段时间以确保连接被关闭(可选) time.Sleep(2 * time.Second) } ~~~ MongoDB支持多种索引类型,以满足不同的查询和性能需求。以下是一些常见的MongoDB索引类型: 1. **单字段索引(Single Field Index):** 最简单的索引类型,对单个字段进行索引,可以是升序或降序。 2. **复合索引(Compound Index):** 在多个字段上创建组合索引,可以更好地支持复杂的查询。复合索引可以包含多个字段,并按照指定的顺序创建。 3. **文本索引(Text Index):** 用于支持文本搜索,可以在文本字段上创建,允许全文本搜索和文本分析。 4. **地理空间索引(Geospatial Index):** 用于地理空间数据(如地理坐标),可以用于地理位置查询和地理位置距离计算。 5. **哈希索引(Hash Index):** 用于散列字段,对字段进行哈希索引,可用于提高散列字段的查询性能。 6. **唯一索引(Unique Index):** 用于确保集合中的字段具有唯一值,重复值将被拒绝插入。 7. **部分索引(Partial Index):** 仅索引满足特定条件的文档,可用于过滤数据。 8. **TTL(Time-To-Live)索引:** 用于自动删除具有指定过期时间的文档,可用于实现数据自动清理。 9. **复合文本索引(Compound Text Index):** 用于在多个文本字段上创建组合文本索引,以支持复杂的全文本搜索。 10. **复合地理空间索引(Compound Geospatial Index):** 在多个地理空间字段上创建组合地理空间索引,用于更复杂的地理查询。 11. **全文本索引(Wildcard Text Index):** 用于全文搜索,通常与文本搜索操作符一起使用。 这些索引类型可以根据您的数据和查询需求进行组合使用,以提高查询性能和效率。不同的索引类型适用于不同的用例,因此在设计数据库模式时需要仔细考虑索引的选择和使用。 ``` import ( "context" "fmt" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 设置MongoDB连接选项 clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") // 连接到MongoDB client, err := mongo.Connect(context.Background(), clientOptions) if err != nil { fmt.Println("连接到MongoDB失败:", err) return } // 选择要创建索引的集合 collection := client.Database("your_database").Collection("your_collection") // 定义要在哪些字段上创建索引,示例为单个字段的升序索引 indexModel := mongo.IndexModel{ Keys: bson.M{ "your_field": 1, // 1表示升序,-1表示降序 }, } // 创建索引 _, err = collection.Indexes().CreateOne(context.Background(), indexModel) if err != nil { fmt.Println("创建索引失败:", err) return } fmt.Println("索引创建成功") } ```