前言
- 在学习MongoDB数据库的操作命令前,首先需要对其中的基础概念进行一个大致的理解才能有利于后续学习。
- 鉴于SQL和NoSQL中存在着的相对关系,不妨可以将MongoDB和SQL中的概念对应起来一起理解,一方面可以在短时间内上手MongoDB,另一方面也有利于加深记忆,面试时也就不需要死记硬背概念,顺着自己的理解和思维逻辑也能讲出个大概。看了很多教程和帖子也都是以这个思路讲解的,我也将沿用这个学习模式。
- 因此,在学MongoDB前最好能够花一个星期的时间学习一下关系型数据库,理解SQL的基础概念及简单的增删改查语句,再着手MongoDB,相信会对两种数据库有更深刻的理解。后续我也会补充MySQL的复习笔记,有兴趣的可以关注一波<( ̄ˇ ̄)/
1 数据库(Database)
MongoDB的数据库概念和SQL基本一致,单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限。通过show dbs
命令可以显示所有数据库。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
复制代码
可以看到有三个默认的数据库,各有其特定功能,了解即可:
- admin: 从权限的角度来看,这是root数据库。若将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的服务器端命令也只能从这个数据库运行。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2 集合(Collection)
集合就是MongoDB文档组,类似于关系型数据库中的表,集合没有固定的结构,可以对集合可以插入不同格式和类型的数据,但通常情况下插入集合的数据都会有一定的关联性。
3 元数据
元数据,我个人把它理解为特殊的集合,但是使用了系统的命名空间:dbname.system.*
,具体有如下几个,包括名字空间、索引、概要信息、用户和服务器信息和状态,暂时先了解即可。
dbname.system.namespaces
dbname.system.indexes
dbname.system.profile
dbname.system.users
dbname.local.sources
复制代码
4 文档(Document)
文档是一组键值对,类似Json。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,但通常情况下插入集合的数据都会有一定的关联性。这也SQL与NoSQL的重要区别之一。
4.1 举个栗子
创建一个名字为socialmeida的数据库use socialmeida
,然后创建一个名字为douyin的集合,并向其中插入4个文档:
db.douyin.insert({"aweme_id":"115615646865","aweme_name":"蜜雪冰城甜蜜蜜","likes":555,"follower":3})
db.douyin.insert({"aweme_id":11561564565,"aweme_name":"105度的热爱","follower":24})
db.douyin.insert({"aweme_name":"三句话让男人为我花18w","follower":"abc"})
db.douyin.insert({"aweme_name":"套马杆","likes":666})
复制代码
再用navicat看看此时的集合中的数据:
类Json的形式看着不舒服?没关系,先来个看得懂的形式过度一下~
可以发现同一个字段中可以出现多个数据类型,SQL做得到吗?突出一个为所欲为︿( ̄︶ ̄)︿
4.2 ObjectId
如果细心观察可以发现,集合中平白无故多出来了一个_id字段,这个字段的数据类型为ObjectId,类似SQL中的唯一主键,其包含12bytes,具体含义如下:
- 前4个字节表示创建unix时间戳
- 接下来的3个字节是机器标识码
- 紧接的两个字节由进程id组成PID
- 最后三个字节是随机数
其目的就是为了保证唯一性,MongoDB中存储的文档必须有一个_id字段,默认数据类型是ObjectId,由于 ObjectId中保存了创建的时间戳,所以不需要再像SQL另外创建一个时间戳字段,可以通过getTimestamp
函数来获取文档的创建时间,我们正好来查一下刚刚输入的第一条文档是什么时候创建的:
> ObjectId("60e9b1b1da4c0000b9005b88").getTimestamp()
2021-07-10 14:41:53.000
复制代码
5 总结
最后,将上面提到的基础概念以表格的形式进行总结:
基础概念 | MongoDB | SQL | 备注 |
---|---|---|---|
数据库 | database | database | 两者一致 |
集合/表 | collection | table | MongoDB集合非结构化 |
文档/行 | document | row | MongoDB文档以类Json格式存储数据 |
唯一主键 | primary key | primary key | MongoDB主键_id自动生成且包含时间戳 |