mongodb 基本概念
- 文档
是 mongodb 的最小数据集单位,是多个键值对有序租户在一起的数据单元,类似于关系型数据库的记录
- 集合
一组文档的集合,文档存放的是数据,集合内的结构是可以不同的,集合就类似于关系型数据库的表
- 库
数据库,由多个集合组成的。每个数据库都市完全独立的,有自己的用户,权限信息,独立的存储文件夹
- 实例
在系统运行库的进程及节点集,一个实例可以有多个数据库
关系型数据库和 mongodb 对比
例如 mongodb 和 mysql 进行对比
文件名 | MongoDB | Mysql |
服务名 | mongod | mysqld |
客户端名 | mongo | mysql |
类似于这这种数据库开源组件,服务名字后面都会有一个 d
客户端程序,是用于与服务端程序通信的
关系型数据库 和 mongodb 基本概念对比学习
概念 | 关系型数据库 | Mongdb |
数据库 | database | database |
表 | table | collection |
数据行 | row data | document |
字段 | column | field |
索引 | index | index |
表关联 | join | embedding 或 linkding |
分片 / 分区 | partition | shard |
分区键 | partition key | sharding key |
上述表格中,我们可以清晰的看出,mongodb 中的 文档 对应着关系型数据库的行数据,mongodb 中的 集合 对应着关系型数据库的 表格
mongodb 的数据类型
前面图上有提到,mongodb 中的文档类似于 json 对象,属于 json 中的一种,成为 bson。
文档中字段中的值可以包括其他文档,成为内嵌文档,也可以包括数组和文档数据
关于文档存储的优点有这些:
- 文档
即为对象,对应于许多编程语言中的本机数据类型
- 嵌入式文档和数组减少了对连接的需求
- 动态模式支持流畅的多态性
咱们一起来看看 bson 都有哪些数据类型,bson 是 json 文档的二进制表示形式,bson 包含了比 json 更多的数据类型,如下:
type | number | 说明 |
Double | 1 | 双精度浮点值 |
String | 2 | 字符串,UTF-8才是合法的 |
Object | 3 | 用于内嵌文档 |
Array | 4 | 数组 |
Binary data | 5 | 二进制数据 |
Udefined | 6 | “undefined” |
Objectid | 7 | 对象 id |
Boolean | 8 | 布尔 |
Date | 9 | 日期时间,unix 标准 |
Null | 10 | 创建空值 |
Regular Expression | 11 | 正则表达式 |
DBPointer | 12 | “dbPointer” |
JavaScript | 13 | “javascript“ |
Symbol | 14 | “symbol” |
JavaScript(with scope) | 15 | “javascript with scope” |
32 - bit integer | 16 | int 类型 |
Timestamp | 17 | mongodb 复制和 sharing 使用的特殊内部类型,前 4 个字节是增量,挨着的 4 字节是时间戳 |
64-bit integer | 18 | long 类型 |
Decimal128 | 19 | decimal |
Min key | -1 | 比正常 bson 类型元素值都低的类型 与 255 是同样的效果 |
Max key | 127 | 比正常 bson 类型元素值都高的类型 |
需要注意的一点:
一个 bson 文档最大的大小是 16M,并且文档嵌套级别不能超过 100 层
看到这里是不是和上述说到的 mongodb 能够存储大量数据 TB 或者 PB 级别的有点矛盾了,没关系,我们来看看这个数据类型
GridFS
用于存储和检索超过BSON-document大小限制 (16mb) 就会使用到 GridFS 数据类型
mongodb 的简单安装
mongodb 的安装方式就不在这里赘述了,可以查看我的历史文章 一文便知 GO 中mongodb 的安装与使用
mongodb 的基本命令使用
总结 mongodb 常用命令
命令 | 作用 |
use 数据库名字 | 若数据库不存在则创建,若存在则使用 |
show dbs | 显示数据库 |
db.dropDatabase() | 删除当前数据库 |
db.集合名字.drop() | 删除集合 |
db.createCollection("集合名字") | 创建集合 |
db.集合名字.insert({}) | 若集合不存在,默认创建并插入数据 若集合存在,则插入数据 |
show collections / show tables | 显示当前数据的集合 |
db.集合名字.insertOne({}) | 插入一条数据 |
db.集合名字.insertMany({[]}) | 插入多条数据 |
db.集合名字.find() | 查找当前表格所有数据 |
db.集合名字.update({条件},{要做的更新操作}) | 更新文档数据 |
db.collection.save({带有 Objectid 的数据}) | 替换已有文档,若 Objectid 主键存在就更新,不存在就插入 |
db.collection.remove({}) | 删除文档 |
db.集合名字.find().pretty() | 以更友好的方式输出 |
关于新建文档注意事项:
- 新建文档,会自动创建不存在的集合,数据库
- 如果不指定主键,则会自动生成主键 _id 和他对应的值
- 写操作都是基本单个文档级别的原子操作
关于 mongo db 查询操作,我们可以有如下运算符可以使用
运算符 | 说明 |
$eq | 等于 |
$lt | 小于 |
$lte | 小于等于 |
$gt | 大于 |
$gte | 大于等于 |
$in | 判断元素是否在指定的集合范围里 |
$all | 判断数组中是否包含某几个元素,无关顺序 |
$nin | 判断元素是否不在指定的集合范围里 |
$ne | 不等于 |
$not | 不匹配结果 |
$or | 有一个条件成立则匹配 |
$nor | 所以条件都不匹配 |
$and | 所有条件都必须匹配 |
$exists | 判断元素是否存在 |
. | 子文档匹配 |
$regex | 正则表达式匹配 |
关于 mongodb 查询的其他操作:
- 选择需要的字段
db.集合名字.find({},{字段名:1})
- 排除不需要的字段
db.集合名字.find({},{字段名:0})
- 数组子元素的选择
db.集合名字.find({},{“字段名.子文档名的字段”:{$slice:[1,2]})
$slice ,可以取两个元素数组,分别表示跳过数和限制数
- 排序
sort()
db.集合名.find().sort({“字段名”:1})
1 是升序
2 是降序
- 跳过和限制
skip(n) , 跳过 n 条数据
limit(n) ,限制 n 条数据
db.集合名.find().skip(3).limit(2)
- 查询唯一的值
db.集合名.find().distinct({“字段名”})
上面暂时都是常常使用到的操作,暂时先梳理到这里,其他的咱们下一篇再接着写,关于上述的操作,还是需要自己一一过一便,经过自己的大脑去思考和对比,才能熟悉的快,以后真正需要的时候就能很快的用上
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~