基础概念
MongoDB 中的数据存储结构
MongoDB是一种面向文档的NoSQL数据库,它的数据存储结构由以下三个部分组成:
- 文档(Document):文档是MongoDB中最基本的单元,由键值对(key-value)组成,类似于JSON对象。文档的值可以是不同的数据类型,包括数组、对象、日期、二进制等。文档的最大尺寸是16MB。
- 集合(Collection):集合是一组文档,相当于关系型数据库中的表(Table)。集合是动态的,不需要预先定义文档的结构或字段。集合可以有索引,以提高查询性能。
- 数据库(Database):数据库是一组集合,相当于关系型数据库中的数据库(Database)。一个MongoDB实例可以承载多个数据库,每个数据库有自己的文件存储空间和权限。
除了上述的存储结构,MongoDB还提供了一种特殊的集合类型,叫做Capped Collection。这种集合有固定的大小,类似于一个循环缓冲区,当空间被填满后,新的插入会覆盖最旧的文档。Capped Collection适合用于存储日志、审计或其他需要按时间顺序访问的数据。
MongoDB支持两种存储引擎:MMAPv1和WiredTiger。存储引擎决定了MongoDB如何在磁盘上组织和管理数据。MMAPv1是MongoDB原生的存储引擎,它使用操作系统的内存映射文件机制来管理数据。WiredTiger是MongoDB 3.0引入的新存储引擎,它使用了更高效的压缩算法和更细粒度的锁机制来提升性能。从MongoDB 3.2开始,WiredTiger成为了默认的存储引擎。
数据库
查看数据库列表
show dbs
查看当前数据库
db
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
创建与切换数据库
use <DATABASE_NAME>
提示
在 MongoDB 中数据库只有真正的有了数据才会被创建出来。
数据命名规则
- 不区分大小写,但是建议全部小写
- 不能包含空字符。
- 数据库名称不能为空,并且必须少于64个字符。
- Windows 上的命名限制
- 不能包括
/\. "$*<>:|?
中的任何内容
- 不能包括
- Unix 和 Linux 上的命名限制
- 不能包括
/\. "$
中的任何字符
- 不能包括
删除数据库
- 使用 use 命令切换到要删除的数据库
- 使用
db.dropDatabase()
删除当前数据库
集合
创建集合
- db.createCollection(name, options)
- name是集合名称,
- options是可选参数,可以指定集合的一些属性,如是否固定大小、索引、最大值等
- db.collection.insertOne/insertMany(document)
- 插入文档,如果集合不存在,mongodb会自动创建集合
向集合中添加/更新数据
db.collection.insert(document)
db.collection.save(document)
- 该方法来保存或更新文档,如果文档有_id字段,则更新该文档,否则向集合中插入新文档
提示
从 MongoDB 4.2 版本开始,save 方法已经被弃用,不建议使用
删除集合
- db.collection.drop()
- 该方法会返回一个布尔值,表示是否删除成功
- db.dropDatabase()
- 该方法来删除整个数据库,该方法会删除当前使用的数据库和所有的集合
查看集合
- show collections
- 查看当前数据库中的所有集合
- show tables
- 查看当前数据库中的所有集合
- db.collection.find(query, projection)
- 该方法来查看集合中的文档,其中query是可选的查询条件,projection是可选的投影条件
文档
- MongoDB 将数据记录存储为 BSON 文档
- BSON(Binary JSON)是 JSON 文档的二进制表示形式,它比 JSON 包含更多的数据类型
文档结构
MongoDB 文档由字段和值对组成,并具有以下结构:
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
字段名称
文档对字段名称有以下限制:
字段名称
_id
保留用作主键;它的值在集合中必须是唯一的,不可变的,并且可以是数组以外的任何类型。字段名称不能包含空字符。
顶级字段名称不能以美元符号
$
开头。从 MongoDB 3.6 开始,服务器允许存储包含点
.
和美元符号$
的字段名称
MongoDB 中的数据类型
字段的值可以是任何 BSON 数据类型,包括其他文档,数组和文档数组。例如,以下文档包含各种类型的值:
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
上面的字段具有以下数据类型:
- _id 保存一个 ObjectId 类型
- name 包含一个嵌入式文档,该文档包含 first 和 last 字段
- birth 和 death 持有 Date 类型的值
- contribs 保存一个字符串数组
- views 拥有 NumberLong 类型的值
下面是 MongoDB 支持的常用数据类型。
类型 | 整数标识符 | 别名(字符串标识符) | 描述 |
---|---|---|---|
Double | 1 | “double” | 双精度浮点值。用于存储浮点值。 |
String | 2 | “string” | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Object | 3 | “object” | 用于内嵌文档 |
Array | 4 | “array” | 用于将数组或列表或多个值存储为一个键。 |
Binary data | 5 | “binData” | 二进制数据。用于存储二进制数据。 |
ObjectId | 7 | “objectId” | 对象 ID。用于创建文档的 ID。 |
Boolean | 8 | “bool” | 布尔值。用于存储布尔值(真/假)。 |
Date | 9 | “date” | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Null | 10 | “null” | 用于创建空值。 |
Regular Expression | 11 | “regex” | 正则表达式类型。用于存储正则表达式。 |
32-bit integer | 16 | “int” | 整型数值。用于存储 32 位整型数值。 |
Timestamp | 17 | “timestamp” | 时间戳。记录文档修改或添加的具体时间。 |
64-bit integer | 18 | “long” | 整型数值。用于存储 64 位整型数值。 |
Decimal128 | 19 | “decimal” | 数值类型。常用于存储更精确的数字,例如货币。 |
_id 字段
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id
字段作为主键。如果插入的文档省略 _id
字段,则 MongoDB 驱动程序会自动为 _id
字段生成 ObjectId
。
_id
字段具有以下行为和约束:
- 默认情况下,MongoDB 在创建集合时会在
_id
字段上创建唯一索引。 _id
字段始终是文档中的第一个字段_id
字段可以包含任何 BSON 数据类型的值,而不是数组。