教程说明
本文是《面向Node.js开发者的MongoDB教程》的第一章,本教程大部分参考了《MongoDB权威指南(第二版)》,Kirstina Chodorow著(O'Reilly, 2013)
。可权威指南中使用的MongoDB版本是2.4.x的。在实际写用户代码时,发现有些语法已经不可用了,本教程所使用的环境中MongoDB版本为5.0.x的最新版。并结合我自己是一名Node.js开发者,教程中应用内代码都是使用的Node.js + Mongoose编写。
安装MongoDB
windows/Linux/MacOS等各个环境MongoDB的安装大家可以在MongoDB官网-《MongoDB社区下载》自行下载安装。本文我更加倾向于读者尝试使用Docker安装MongoDB,理由有两个:
1. 简单: 只需要使用一行命令,就可以通过镜像运行一个MongoDB数据库的容器
2. 易于调试: 教程中可能需要对同一份数据进行增删改查,使用Docker可以创建多个互不干扰的容器,方便调试对比。
数据来源(B站热点)
本次教程中数据库的数据,来源来自B站的“综合热门”的后端接口数据。笔者提供了25300条文档数据,方便之后的教程中用来进行数据的增删改查。下面取了一条数据库中的数据:
大家可以通过百度网盘下载我提供的数据文件bilihot.json
,并导入到MongoDB中。
使用mongoimport
导入bilihot.json
:
参数说明:
-d
: 数据库名称-c
: 集合名称--file
: 要导入的文件路径--type
: 导入的文件类型,默认为json
建议使用云服务器
对于大部分前端开发者而言,不仅建议在本地跑一遍相关代码,更加建议自己购买一个云服务器,安装MongoDB后使用远程命令行连接运行一遍。这样有利于学习Linux相关命令、适应后端运行环境。
阿里云-云服务器最新优惠活动地址
MongoDB基础
数据库
在MongoDB中,多个文档组成集合,而多个集合可以组成数据库。一个MongoDB实例可以承载多个数据库,每个数据库拥有0个或者多个集合。每个数据库都有独立的权限,即便是在磁盘上,不同的数据库也放置在不同的文件中。
在MongoDB中,我们可以使用use db_name
来切换数据库,例如本教程中我们的数据库名称为bilibili_hot
,那么你可以通过以下命令进入到该数据库。
文档
文档(document)是MongoDB中的核心概念,如果你熟悉MySQL等关系型数据库,你可以将文档比喻为一行。文档在JavaScript文档被表示为为对象,例如刚才存入数据库中的一条B站热点数据就是一个文档:
MongoDB的文档区分类型和大小写,并且不能有重复的key,这和JavaScrit中对象的概念基本一致,对于Node.js开发者来说很好理解。例如下面两个文档就是不同的:
下面两个文档也是不同的:
集合
集合(collection)就是一组文档,一个或多个集合组成了一个MongooDB的数据库,我们可以将集合比喻为关系型数据库中的一张表。
集合的英文单词是collection
,这个单词在MongoDB的操作中经常会使用到:
- 例如显示所有的集合:
- 创建集合
statistics
- 查询
hotspots
集合中的全部文档数据:
MongoDB中的集合是动态模式,这意味着集合中的文档的结构和类型可以是各式各样的,下面两个文档是可以放在同一个集合中,一个文档存的是视频的名称,一个文档存的是视频的播放次数。
上面的两个文档,不仅是值的类型不一致,同时键也不一致。作为一名有经验的程序员,肯定不会在集合中这样去组织文档。针对上面的的情况,我们建议使用不同的集合去存储视频的基本信息和视频的统计信息(播放数、点赞数、投币数等)
mongod
启动MongoDB
在命令行执行mongod
,即可启动MongoDB服务器,mongod在启动时可以使用许多可配置项,下面列举几个常用的:
--dbpath
: 指定一个目录作为数据目录,其默认目录为/data/db
--port
: 指定服务器监听的端口号,mongod默认占用27017
端口--fork
:调用fork
创建子进程,在后台运行MongoDB。启用--fork
时,必须同时启用--logpath
--logpath
:指定文件作为输出信息的文件,而非在命令行上输出。--config
:额外加载配置文件,未在命令行中指定的选项将使用配置文件中的从参数。
停止MongoDB
关闭运行中的服务器的命令是一个管理员命令,首先我们需要在Mongo Shell中切换到admin
数据库。
再使用db.shutdownServer()
mongo
在命令行执行mongo
,可以启动mongosh(又称MongoDB Shell),它是我们学习MongoDB最重要的工具,绝大多数的MongoDB操作都需要使用shell完成。在运行mongo
前,请先执行mongod
运行MongoDB服务器,之后shell将自动连接到MongoDB服务器。
shell是一个独立的MongoDB客户端,启动时,shell会连接到MongoDB服务器的test数据库我们可以使用db
命令查看当前使用了哪个数据库:
- 查看当前数据库
db
- 查看目前所有的数据库
show dbs
- 使用某一个数据库
use 数据库名
, 例如使用bilibili_hot
数据库
CRUD
创建文档
insert()
方法用于把文档插入集合中,我们把一条数据插入到hotspots
集合下
查询文档
find()
方法用于查询集合中的文档,如果想查询一个文档,可用findOne()
。我们来找到刚才新增的那一个文档:
修改文档
update()
方法用来修改文档,我们来改变刚才新增的那个文档的title
字段:
删除文档
remove()
方法用来将文档从集合中永久移除,我们来把刚才更改过的那条文档给删除掉:
Mongoose基础
Mongoose是在node环境中MongoDB数据库操作的封装,一个对象模型工具。将数据库中的数据转换为JavaScript对象以方便我们在应用中使用。
安装Mongoose
Connection
你可以使用mongoose.connect()
方法连接到MongoDB:
该方法的第1个参数是MongoDB的连接地址,第2个参数是一个options
对象,该对象会被Mongoose传递给MongoDB的驱动程序,你可以在《MongoDB Node.js驱动程序文档》中找到完成的options
的配置项, 下面是一些比较重要的配置项:
user/pass
: 用于认证的用户名和密码。Mongoose 特有,等价于 MongoDB 驱动的auth.user
和auth.password
选项。useFindAndModify
:默认为true
,设置为false
会让findOneAndUpdate()
和findOneAndRemove()
使用findOneAndUpdate()
而不是findAndModify()
。poolSize
:MongoDB 驱动程序将为此连接保持打开的最大套接字数。默认情况下,poolSize
是5。useNewUrlParser
:底层 MongoDB 驱动程序已弃用其当前的连接字符串解析器。因为这是一个重大变化,他们添加了一个useNewUrlParser
标志,允许用户在发现新解析器中的错误时回退到旧解析器。你应该设置,useNewUrlParser: true
。
Schema
Schema是Mongoose中的重要概念,Schema定义了集合中文档的结构。结合上文提到的数据库的数据,我们定义的Schema如下所示:
Model
Model
是从Schema
编译来的构造函数,这也就是为什么这里需要使用大写字母开头的原因。Model
负责从MongoDB中创建和读取文档。
当你调用mongoose.model()
是时,Mongoose就会为你编译一个Model
。
- 参数1: 是collection的单数名称,也就是说,当你的数据库中没有任何集合的时候,当你使用Mongoose连接到MongoDB,并准备插入数据时,Mongoose会自动为你创建一个叫
hotspots
的集合。 - 参数2: 调用
new Schema
所创建的Schema
CRUD
创建好Model
后,你就可以使用Model
对应的方法操作集合中的文档了,这里我们简单的介绍一下使用Mongoose中的CRUD方法。
创建文档
你可以使用Model.create()
创建一条文档数据:
查询文档
查询的方法有很多,目前我们只介绍Model.find()
,让我们来查询刚才新增的那一条数据吧:
修改文档
我们可以使用Model.updateOne()
更新数据库中的文档
删除文档
让我们使用Model.deleteOne()
删除刚才更改的文档吧,把我们的数据库恢复原貌:
Mongoose总结
在想使用Mongoose来对MongoDB进行操作前,需要先进行三步操作,分别是:
- 连接MongoDB
- 生成Schema
- 生成Model
然后在Model中可以进行相应的CRUD操作
其他
1. 使用Docker安装MongoDB
运行MongoDB容器 使用下面命令运行一个mongo容器,如果你本地没有找到mongo的镜像,那么docker会自动拉取远程镜像,可能会耗时比较长。
参数说明:
-p
: 端口映射,-p 27019:27017
是指将容器内27017
端口映射到宿主机的27019
端口--name
:容器命名,--name mymongo
将该运行中的容器命名为mymongo
-v
: 数据卷,-v ~/db:/data/db
将容器内存放数据的/data/db
目录映射到宿主机的~/db
目录上
查看容器运行状态
使用docker ps
命令查看容器的运行状态
进入容器内并进入bash操作
我们可以使用docker exec
进入容器内,调式MongoDB。需要注意的是,ddfc4fd875e6
是上一步执行docker ps
命令显示的CONTAINER ID
,读者的值肯定和笔者的不一致,需替换成自己的CONTAINER ID
。
上面表示已经进入到了容器内部,我们来查看一下MongoDB的版本,在命令行输入mongo
进入MongoDB shell。
此时进入到了MongoDB shell中,我们就可以执行相应操作了
退出shell和容器
2. 参考文献
- Mongoose官网
- MongoDB官网
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!