本文已参与「新人创作礼」活动,一起开启掘金创作之路。 @TOC
(一)MongoDB 概念解析
| SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接, MongoDB 不支 持 | |
| primary key | primary key | 主键, MongoDB 自动将 _id 字段设置为主键 |
在 MongoDB 中基本的概念是文档、集合、数据库,下面我们挨个介绍。通过下图实例,我们也可以更直观的了解 MongoDB 中的一些概念:
1. 数据库初步
一个 MongoDB 中可以建立多个数据库。MongoDB 的单个实例可以容纳多个独立的 数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs"命令可以显示所有数据库的列表。
执行"db"命令可以显示当前数据库对象或集合。
运行"use"命令,可以连接到一个指定的数据库。
以上实例命令中,"local" 是你要连接的数据库。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意 UTF-8 字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多 64 字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据 库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这 个数据库运行,比如列出所有的数据库或者关闭服务器。
- local:这个数据库永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
2. 文档
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。 一个简单的文档例子如下: {"site":"www.zhihu.com", "name":"知乎"} 需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至 可以是整个嵌入的文档)。
- MongoDB 区分类型和大小写。
- MongoDB 的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
3. 集合
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。 集合存在于数据库中,集合没有固定的结构,这意味着你在集合中可以插入不同格式 和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。 比如,我们可以将以下不同数据结构的文档插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
当第一个文档插入时,集合就会被创建。
4. 合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有\0 字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含, 这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则 千万不要在名字里出现$。
(二)MongoDB 创建数据库(use database_name)与删除数据库
1. 创建数据库
(1)语法 MongoDB 数 据 库 的 创 建 是 隐 式 创 建 的 。 创 建 数 据 库 的 语 法 格 式 如 下 :
use database_name
如果数据库不存在,则创建数据库,否则切换到指定数据库。
(2)实例
以下实例我们创建了数据库 student:
如果你想查看所有数据库,可以使用 show dbs 命令:
可以看到,我们刚创建的数据库 student 并不在数据库的列表中,要显示它,我们需要向 student 数据库插入一些数据。
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数 据库中。
2. MongoDB 删除数据库
语法: MongoDB 删除数据库的语法格式如下:
db.dropDatabase()
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名
实例:
以下实例我们删除了数据库 student。
(1)首先,查看所有数据库:
(2)接下来我们切换到数据库 student :
(3)执行删除命令:
(4)最后,我们再通过 show dbs 命令数据库是否删除成功:
(三)MongoDB 创建集合与删除集合
1. MongoDB 创建集合
MongoDB 中使用 createCollection()方法来创建集合。 语法格式:
db.createCollection(name,options)
参数说明:
name: 要创建的集合名称。
options: 可选参数, 指定有关内存大小及索引的选项。
options 可以是如下参数:
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
实例:
在 test 数据库中创建 python 集合:
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
下面是带有几个关键参数的 createCollection() 的用法: 创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
在 MongoDB 中,集合也可以隐式创建。当你插入一些文档时,MongoDB 会自动创建集合。
2. 删除集合
集合删除语法格式如下:
db.collection.drop()
以下实例删除了 test 数据库中的集合 site:
(四)MongoDB 插入文档
1. 插入单条文档
文档的数据结构和 JSON 基本一样。 所有存储在集合中的数据都是 BSON 格式。 BSON 是一种类 json 的一种二进制形式的存储格式,简称 Binary JSON。 插入文档。 MongoDB 使用 insert()方法向集合中插入文档,语法如下:
db.collection_name.insert(document)
实例:
以下文档可以存储在 MongoDB 的 student 数据库的 python 集合中:
以上实例中 python 是我们的集合名,如果该集合不在该数据库中,MongoDB 会自动创 建该集合并插入文档。 查看已插入文档:
我们也可以将数据定义为一个变量,如下所示:
执行后显示结果如下:
执行插入操作:
2. 插入多条文档
当我们想要一次性插入多个文档到一个集合中时,可以使用方括号数组的格式来容纳 多个文档。
(五)MongoDB 中的查询表达式
在 MongoDB 中的查询表达式就相当于 sql 中的 where 子句的查询条件,可以用来过滤 数据。当我们删除,更新或者查找时,都需要查询表达式作为第一个条件用来过滤到底删除或者更新或者查找哪一条数据,所以掌握好查询表达式是掌握 MongoDB 中 CRUD 的关键。
-
等于:{field:value}表示 field=value
-
小于:{field:{$lt:value}}表示:field<value
-
大于:{field:{$gt:value}}表示:field>value
-
小于等于:{field:{$lte:value}}表示:field<=value
-
大于等于:{field:{$gte:value}}表示:field>=value
-
不等于:{field:{$ne:value}}表示:field!=value
-
$nor:用来表示多个条件都不满足
-
$and:表示多个条件同时满足,相当于逻辑关系中的且。
-
$or:表示多个条件满足其中之一,相当于逻辑关系中的或。
(六)MongoDB 更新文档
MongoDB 使用 update()方法来更新集合中的文档。
1. update()方法
update()方法用于更新已存在的文档。语法格式如下:
参数说明:
- query:即查询表达式。
- update: update 的对象和一些更新的操作符(如inc...)等,也可以理解为 sql update 查询内 set 后面的内容。一般要配合更新表达式来进行操作。
- upsert: 可选,这个参数的意思是,如果不存在 update 的记录,是否插入 objNew, true 为插入,默认是 false,不插入。
- multi: 可选,MongoDB 默认是 false,只更新找到的第一条记录,如果这个参数 为 true,就把按条件查出来多条记录全部更新。
(1)新文档替换旧文档
MongoDB 的 update 方法中 update 条件需要配合一定的更新表达式才能做到文档更新, 如果该参数是一个文档,则该 update 方法的实际操作其实是:用 update 条件所对应的文档 替换 query 查询出来的文档。
例如:在 test 数据库下的 goods 表中插入一条商品。
如果运行下面命令:
再来查看这个 goods 集合下的数据:
从上面的例子中可以看出商品这条文档被替换成了新文档{name:’张三’,age:3},并没有达 到更新的目的。
(2)更新表达式
在 shop 库下创建一个 goods 集合,在这个集合中插入如下图 所示的一些商品信息。
我们在这个集合中做一下更新练习。
其中各字段表示含义如下:
- Goods_id:商品 id
- Cat_id:栏目 id
- Goods_name:商品名称
- Goods_number:商品库存量
- Click_count:点击量
- Shop_price:商品价格
$set 修改某列的值
将 goods_id 的商品价格变成 2000
$unset 删除某个列
将栏目 3 的 add_time 这个 field 删除
这里之所以只有一条的 add_time 列没了是因为 update 方法默认值修改一列,当其中可选参 数 multi 参数为 true 才会更新所有匹配到的文档。
可以运行下面命令做到全部将栏目为 3 的列的 add_time 字段删除。
$rename 重命名某个列
将 goods_number 小于 2 的文档的 cilck_count 改成 count_click
$inc 增长某个列
将 goods_id 为 11 的商品的价格降低 100
(七)MongoDB 删除文档
MongoDB remove()函数是用来移除集合中的数据
MongoDB 数据更新可以使用 update()函数。在执行 remove()函数前先执行 find()命令 来判断执行的条件是否正确,这是一个比较好的习惯
语法:
如果你的 MongoDB 是 2.6 版本以后的,语法格式如下
参数说明:
- query:(可选)删除的文档的条件,即查询表达式
- justOne: (可选)如果设为 true 或 1,则只删除一个文档,默认全部删除。
- writeConcern:(可选)抛出异常的级别。
实例:在 goods 集合中删除 goods_id 为 1 的文档。
先查询 goods_id 为 1 的文档
运行删除命令
查询发现这条数据已经不存在,结果如下:
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
(八)MongoDB 查询文档
1. MongoDB 查询文档使用 find() 方法。
find()方法以非结构化的方式来显示所有文档。
- query:可选,使用查询操作符指定查询条件
- projection:可选,查询结果中显式的列。 语法:{field:1/0} 其中 1 表示显示,0 表示不显示。
如果你需要以易读的方式来读取数据,可以使用 pretty()方法,语法格式如下:
pretty()方法以格式化的方式来显示所有文档。
实例 1:查询 goods_id 为 4 的商品,不显示_id 字段
实例 2:取出不属于第 3 栏目且不属于第 11 栏目的商品
实例 3:取出价格大于 100 且小于 300,或者大于 4000 且小于 5000 的商品
(九)MongoDB 中 limit、skip、sort、count 方法
1. MongoDB 中的 limit() 方法
如果你需要在 MongoDB 中读取指定数量的数据记录,可以使用 MongoDB 的 limit 方法,limit()方法接受一个数字参数,该参数指定从 MongoDB 中读取的记录条数。
实例:查询 goods 集合中的价格大于 1000 的数据并取出前 3 条
2.MongoDB 中的 skip()方法
我们除了可以使用 limit()方法来读取指定数量的数据外,还可以使用 skip()方法来跳 过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
实例:查询 goods 集合中的价格大于 1000 的数据,跳过 3 条取 2 条
3.MongoDB 排序 sort()方法
在 MongoDB 中使用 sort()方法对数据进行排序,sort()方法可以通过参数指定排序的 字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1 是用于降序排列。
实例:查询 goods 集合中的所有数据,并按价格排序
4.MongoDB 中的 count()方法
在 MongoDB 中使用 count()方法对数据进行统计。类似 sql 中 select count(*) from mycol。
实例:统计 goods 集合中有多少条文档