mongoDB分布式存储(一)
1. mongoDB功能介绍
1.1 核心特性
- 文档数据库,基于二进制json存储文档
- 高性能、高可用、直接加机器就可以解决扩展性问题
- 支持丰富的CRUD操作,例如聚合统计、全文检索、坐标检索
1.2 文档数据库
存放的是json格式的数据,任何字段都不需要提前定义
{ name:"pp", age:23, status:"working", groups:["news","sports"] }
2. mongoDB架构
存储引擎是数据库和硬件之间的接口,它负责处理用什么数据结构存储数据,以及如何写入、删除和读取数据。不同的工作负载类型对于读写性能的需求不同,例如新闻网站需要大量的读,而社交类网站需要大量的写。MongoDB 3.0开始,提供了可插拔的存储引擎API,使得用户可以在MongoDB和第三方提供的多种存储引擎之间切换。
在一个MongoDB复制集中,多种存储引擎可以并存,可以满足应用更复杂的需求。例如,使用In-memory存储引擎进行低延时的操作,同时使用基于磁盘的存储引擎完成持久化。
目前MongoDB默认使用的是WiredTiger存储引擎,WiredTiger是SleepyCat提供的一款开源数据引擎。通过使用现代编程技术,如Hazard指针和Lock-free算法,WiredTiger实现了多核可扩展性。
3. mongoDB简单用法示例
- 列举数据库:show databases
- 选择数据库:use my_db1 --数据库无需创建,只是一个命名空间
- 列举数据表:show collectons
- 建立数据表:db.createCollection("my_collection") --数据表schema free,无需定义字段
- 插入document:db.my_collection.insertOne({uid:10000,name:"xiaoming",likes:["football","game"]}) --任意嵌套层级的json,文档ID自动生成,无需指定
- 查询document:db.my_collection.find({likes:'football',name:{$in:['xiaoming','libai']}}).sort({uid:1}) --基于任意json层级过滤
- 更新document:db.my_collection.updateMany({likes:'football'},{$set:{name:'libai'}}) --第一个参数是过滤条件,第二个参数是更新操作
- 删除document:db.my_collection.deleteMany({name:'xiaoming'}) --参数是过滤条件
- 创建index:db.my_collection.createIndex({uid:1, name:-1}) --可以指定创建索引时的正反顺序,影响排序效率
所有操作示例见官方文档:https://docs.mongodb.com/manual/crud/
4. mongoDB单机安装
推荐使用docker安装单机mongoDB,主要是方便...docker search mongo #搜索mongo镜像,如果没有特殊需求建议选择官方版
#搜索mongo镜像,如果没有特殊需求建议选择官方版 docker search mongo #不加tag默认拉取最新镜像 docker pull mongo #查看镜像是否拉取成功 docker images #暴露27017端口,连接客户端,同时可以-v 选择挂载volume docker run -itd --name mongo -p 27017:27017 mongo #查看mongo服务是否已经启动 docker ps #进入mongo容器 docker exec -it mongo mongo admin #新增admin用户,密码123456 db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); #admin用户登录mongo db.auth('admin','123456')
5. 客户端连接mongoDB
首先需要install客户端
go get go.mongodb.org/mongo-driver/mongo
go-mongo详细的api文档可以看官网文档,有很详细的example
https://pkg.go.dev/go.mongodb.org/mongo-driver@v1.8.0/mongo#pkg-overview
func main() { // 建立连接 5s超时 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://xxx.xxx.xxx.xxx:27017"), options.Client().SetConnectTimeout(time.Second*5)) if err != nil { fmt.Println(err) return } // 选择数据库 database := client.Database("my_db") // 选择表 collection := database.Collection("my_collection") collection = collection }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理