> # 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("索引创建成功")
}
```
- Golang
- 切片 slice
- 数组和切片的区别
- 左闭右开
- make([]int, 5) 和 make([]int, 0, 5) 区别
- 切片非线程安全,并发操作为啥不会像map一样报错
- []struct{} 如何遍历
- 切片如何删除某个元素
- append 一个nil 切片
- 哈希表 map
- 并发操作
- 并发写报错
- 并发读不会报错
- 并发读有写报错
- 并发迭代有写报错
- 自制并发安全字典
- 官方并发安全字典
- 对未初始化的 map 进行赋值操作
- map的底层
- 无序输出
- 等量扩容
- 实现集合
- map的key可以使哪些值
- 协程 go
- 协程相关阅读
- 进程、线程、协程
- 协程 (捕获异常 和 协程池)
- GPM 模型
- CSP模型
- channel
- channel 相关操作
- 交替打印
- 如何让channel 只能接收/只能发送
- channel 常见报错
- channel 死锁
- nil channel 和 已关闭的 channel
- 使用 select 来多路复用 channel
- channel 的使用
- 接口和结构体
- 简单使用
- 两个结构体能否比较
- 工厂模式
- 概念
- 简单工厂
- 方法工厂
- 堆和栈,值类型和引用类型,内存逃逸,垃圾回收
- 栈和堆
- 内存逃逸
- 值类型和引用类型
- 垃圾回收方式
- 性能优化分析工具 pprof
- golang 代码片段
- 片段一 defer
- 片段二 channel
- Golang 相关
- Golang 相关阅读
- Golang 1-10
- make 和 new 的区别
- 使用指针的场景
- Go语言的context包
- 位运算
- Copy 是浅拷贝还是深拷贝
- init 函数 和 sync.Once
- select 多路复用
- Golang 其它
- MongoDB
- 可比较类型 与 可转json 类型
- Gorm
- 面向对象和面向过程
- go语言实现-面向对象
- go语言实现-面向过程
- 限流,熔断,降级
- 了解
- 熔断配置
- 熔断例子
- 服务降级
- github.com/alibaba/sentinel-golang
- 互斥锁 读写锁 原子锁
- 为什么需要锁
- 互斥锁
- 读写锁
- 原子锁
- 互斥锁性能对比
- 原子锁性能对比
- 互斥锁 or 原子锁?
- 条件锁
- 计数器
- GoFrame
- GF1.16版本
- 修改使用的表
- 按天、周、月、年
- GoFrame 文档
- 配置文件
- 生成脚本
- 排序算法
- 相关排序
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 归并排序
- 堆排序
- 数据库
- 分布式怎么保证线程安全
- 数据库实现方式
- 基于表记录
- 乐观锁
- 悲观锁
- Redis实现方式
- Zookeeper实现方式
- Mysql 相关
- group_concat
- 索引优化
- 索引优化1
- 定期分析和优化索引
- 覆盖索引
- 组合索引
- 聚簇索引和非聚簇索引
- 索引类型与方式、聚簇与非聚簇索引
- 事务特征和隔离级别
- 查询优化
- mysql自增表插入数据时,Id不连续问题
- InnoDB引擎 和 MyISAM引擎区别
- 锁
- 悲观锁和乐观锁
- 查询,更新,插入语句
- 什么是死锁
- 怎么处理死锁
- MySQL 隔离级别
- 事务特征
- 隔离级别
- 废弃3
- 索引
- 索引类型和方式、聚簇和非聚簇索引(上)
- 索引类型和方式、聚簇和非聚簇索引(下)
- 回表、覆盖索引、最左前缀、联合索引、索引下推、索引合并
- Mysql 优化
- 索引的原理
- 千万级表修改表结构
- Redis
- 获取随机三条数据
- Redis 持久化方式
- 全量模式 RDB 冷备份(内存快照)
- 增量模式 AOF 热备份(文件追加)
- 过期key的删除策略、内存淘汰机制
- 数据结构
- 位图
- 网络
- 网络相关
- 游戏同步方式:帧同步和状态同步
- Websocket
- OSI模型
- TCP 与 UDP
- 三次握手四次挥手
- Http 状态码
- 1xx(信息性状态码)
- 101 服务端代码
- 101 客户端代码
- 2xx(成功状态码)
- 3xx(重定向状态码)
- 302 服务端代码
- 302 客户端代码
- 4xx(客户端错误状态码)
- 5xx(服务器错误状态码)
- 如何排查接口问题
- 网络请求和响应过程
- time_wait
- keep-alive
- http 和 rpc 的区别
- I/O多路复用 select和poll
- too many open file
- 其它技术
- git 相关操作
- 修改提交备注
- 多个提交合并成一个提交
- 回退版本
- 小程序和公众号
- 消息模板
- 获取code
- 静默登录
- 其它技术相关
- C盘空间不足
- 生成式人工智能AIGC
- 共享文件
- 接口文档, mock提供测试数据
- 抓包工具
- Python
- 安装包失败
- 自动化测试 Scrapy
- AIGC:人工智能生成内容
- PHP
- xhprof 性能分析
- 一键安装
- 哈希冲突的解决方式
- 链地址法(拉链法)
- 开放地址法
- 再哈希
- 概念1
- Nginx
- 负载均衡方式
- 加密解密
- 简单了解
- 签名算法例子
- 码例子1
- 代码例子2
- Linux
- netstat (用于查看和管理网络连接和路由表)
- ps 用于查看和管理进程
- ab 压测
- nohup 守护进程
- lsof (List Open File 获取被进程打开文件的信息)
- tail 查看日志
- 各类linux同步机制
- Socket 服务端的实现,select 和epoll的区别?
- scp 传输,awk 是一个强大的文本分析工具
- pidof
- 项目
- 棋牌
- 牌的编码
- 出牌规则
- 洗牌
- 股票
- 股票知识
- 龙虎榜数据缓存方式
- 单日龙虎榜数据
- 单只股票的历史上榜
- 遇到的问题
- 浮点数精度问题
- Mysql Sum 精度问题(float, double精度问题)
- 分页问题(数据重复)
- 工具包
- v3
- common.go
- common_test.go
- customized.go
- customized_test.go
- slice.go
- slice_test.go
- time.go
- time_test.go
- v4
- common.go
- common_test.go
- customized.go
- customized_test.go
- slice.go
- time.go
- time_test.go
- 相关阅读
- 切片 slice
- 集合 map
- 协程 goroutine
- 通道 channel
- 相关阅读 s
- pyTorch
- defer
- 内存泄漏