目前,MongoDB是非关系型数据库中功能最丰富、最像关系型数据
库的产品。MongoDB由10gen团队在2007年发起,2009年2月首度推出。
MongoDB支持的数据结构类似于json的bson格式。这种数据结构非常松
散,可以很方便地存储比较复杂的数据类型。MongoDB的主要特点是高
性能、易存储、易使用、易部署。
MongoDB的最小数据单位是文档(类似于关系型数据库中的行)。
文档是由多个键及其对应的值组成的(类似于json),一组文档共同
组成了一个集合。集合类似于关系型数据库中的表,但是一个集合中
的文档可以是各种各样的,一组集合就组成了一个数据库。MongoDB可
以承载多个数据库,这些数据库可以看作是相互独立的。
(1)MongoDB的官方网站是https://www.mongodb.com/。读者可
以 在 MongoDB 官 方 网 站 的 下 载 页 面
https://www.mongodb.com/download-center选择相应的版本进行下
载,如图7.1所示。
(2)在这里以Windows版本为例,将下载下来的MongoDB软件按照
常规软件的步骤安装即可。需要提醒的是,在安装过程中,MongoDB默
认安装在C盘,可以在安装过程中选择安装的路径(因为MongoDB的操
作需要用到这个路径,所以读者要选择一个合适的路径进行安装),
如图7.2和图7.3所示。
(3)安装完成后,需要配置数据存储的文件夹和MongoDB的日志
文件夹。在MongoDB安装的路径中新建一个?为db的文件夹作为数据库
存储的文件夹,同时新建一个?为mongolog的文件夹作为日志文件存
储的文件夹。在db文件夹的同级目录下新建一个?为mongo.config的
文件作为配置文件,写入以下内容:
此时,整个目录结构如图7.4所示。
打开CMD工具,输入以下命令,就可以启动MongoDB了:
mongod --dbpath 你的db文件夹地址
使用mongoose连接MongoDB
mongoose 是 一 个 基 于 node-mongodb-native 开 发 的 MongoDB 的
Node.js驱动,可以很方便地在异步环境中使用。
mongoose 的 GitHub 地 址 是
https://github.com/Automattic/mongoose。mongoose的官方网站是
http://mongoosejs.com/,读者可以在mongoose的官方网站中阅读相
应的说明文档。
使用mongoose这个模块前,首先需要通过NPM安装这个模块:
npm install mongoose
mongoose模块通过connect()方法与MongoDB创建连接。connect()
方法中需要传递一个URI地址,用来说明需要连接的MongoDB数据库。
如下代码就和本地的MongoDB数据库article建立了连接。
【代码7-1】
代码说明】
connect()方法创建MongoDB连接,回调函数中err为参数,出现连
接错误则打印出“connect failed”,连接成功则打印出“connect
success”。
运行这段代码,如果MongoDB服务已经正常开启,就会在控制台打
印出“connect success”字样。
需要说明的是,connect()方法中uri参数的完整示例应该是:
mongodb://user:pass@localhost:port/database
user:代表MongoDB的用户名。
pass:代表用户名对应的密码。
port:代表MongoDB服务的端口号。
mongoose中的一切由schema开始。schema是一种以文件形式存储
的数据库模型骨架,并不具备数据库的操作能力。schema中定义了
model中的所有属性,而model则是对应一个MongoDB中的collection。
以下代码定义了一个schema并且注册成了一个model。
【代码7-2】
【代码说明】
这段代码通过实例化一个mongoose.Schema()对象定义一个model
的所有属性,类似于关系型数据库中的字段和字段的数据类型。
schema合法的类型有String、Number、Date、Buffer、Boolean、
Mixed、?bjectid和Array。mongoose中通过mongoose.model()方法注
册一个model。
在mongoose中可以调用save()方法将一个新的文档插入到已有的
collection中,请看下面的代码。
【代码7-3】
【代码说明】
这段代码调用?为Article的model,之后定义了一个Article的文
档,最后使用save将记录插入到相应的collection中。save()方法中
的回调函数监听是否出错。
运行这段代码,在MongoDB运行正常的情况下,控制台将输出
“save successed”字样。
可以在控制台对MongoDB进行操作来查看MongoDB中是否存在这样
一条记录,连接完MongoDB后打开控制台,输入以下命令切换至
article数据库:
use article
切换成article数据库后可以使用以下命令来查看article这个数
据库存在的所有collection:
show collections
这时,可以看到控制台中存在一个?为articles的collection,
如图7.5所示。
通过以下命令可以查看这个?为articles的collection中的所有
文档:
db.articles.find()
如果刚才的这个文档插入成功,控制台就将会显示这个文档,如
图7.6所示。
名为articles的collection中出现了插入的这个文档,说明
MongoDB中的确保存了刚刚插入的这条记录。
当然,使用mongoose同样可以查询相应的数据。如下代码的功能
就是将articles这个collection中的所有文档查询出来。
【代码7-4】
【代码说明】
这段代码通过find()方法查找相应的数据记录。find()方法中的
第一个参数是一个json对象,定义查找的条件,第二个参数为回调函
数。回调函数中的第一个参数是error,第二个参数是查询的结果。
运行这段代码,可以发现控制台输出了相应的数据记录,如图7.7
所示。
在find()方法中的第一个参数中可以传入筛选条件,以便更?精
确地查找出需要查找的数据。现将find()方法的代码修改为以下代
码:
【代码7-5】
运行这段代码同样可以查询出记录。
与find方法类似的还有findOne()方法,find()方法是查询完所有
符合要求的数据后返回结果,而findOne()方法则是查询一条数据,返
回的是查询得到的第一条数据。
在mongoose中可以直接在查询记录后修改记录的值,修改后直接
调用保存即可。如下代码查询数据后直接修改数据的title值为
javascript。
【代码7-6】
同样,在命令行中查询记录MongoDB,可以发现原来这个文档中的
title值已经被修改,如图7.8所示。
类似于修改数据,删除MongoDB的文档也可以在查询出文档后直接
调用remove方法。如下代码可以删除articles集合中的所有文档。
【代码7-7】
提示
只有单个文档可以调用remo?e()方法,因为find()方法返回的是一
个符合查询条件的所有文档组成的数组,所以这里调用数组的
forEach()方法逐个删除所有的文档。同样,在命令行中查询记录
MongoDB,可以发现原来articles这个集合的所有文档已经为空
了。
以上的知识实现了使用mongoose对MongoDB数据库进行简单的增删
改查。更多关于mongoose的使用,读者可以通过阅读mongoose的官方
文档进行学习。