在Windows10系统中安装和使用MongDB6.0
作者:厦门大学计算机系林子雨副教授
说明:本博客是与林子雨编著《数据采集与预处理》教材配套的教学资料。
MongoDB是一个基于分布式文件存储的数据库,采用C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是目前非关系数据库当中功能最丰富、最像关系数据库的数据库。
传统的关系数据库一般由数据库(database)、表(table)和记录(record)3个层次概念组成,而MongoDB由数据库(database)、集合(collection)和文档对象(document)3个层次组成。MongoDB中的集合对应关系型数据库中的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。MongoDB与关系数据库的概念对比如表1所示。
一、安装MongoDB
访问MongoDB官网(https://www.mongodb.com/try/download/community ), 下载MongoDB安装文件,比如mongodb-windows-x86_64-6.0.4-signed.msi。下载好后进行安装,如图1所示,选择“Complete”,会弹出如图2所示界面,所有选项都采用默认设置,点击“Next”按钮进入下一步。这时会进入MongoDB Compass的安装选择界面(如图3所示),MongoDB Compass 是一个图形界面管理工具,这里可以不安装,因此,"Install MongoDB Compass"不勾选,然后点击“Next”按钮进入下一步,完成安装。
图1 选择安装类型
图2 服务配置
图3 安装MongoDB Compass
需要配置系统环境变量,具体方法是:使用快捷键“win+i”打开“设置”界面,在上方搜索框中输入“高级系统设置”(如图4所示),然后点击“查看高级系统设置”。在弹出的界面中(如图5所示),点击“环境变量”。在弹出的界面中(如图6所示),在“系统变量”中选中“Path”,然后单击“编辑”按钮,在弹出的界面中(如图7所示),点击“浏览”按钮,然后找到MongoDB安装目录的bin子目录(如图8所示),再点击“确定”按钮,环境变量就设置成功了(如图9所示),然后点击界面中的“确定”按钮即可结束操作。
图4 Windows设置
图5 系统属性
图6 系统变量
图7 编辑环境变量
图8 浏览文件夹
图9 添加环境变量成功
在MongoDB安装目录的data目录下新建一个名为db的文件夹(如图10所示)。
图10 在data目录下新建一个名为db的文件夹
在MongoDB的安装目录下新建一个文件mongo.config(如图11所示)。
图11 在安装目录下新建一个文件mongo.config
在mongo.config里面写入如下内容:
dbpath=C:\Program Files\MongoDB\Server\6.0\data\db #数据库路径
logpath=C:\Program Files\MongoDB\Server\6.0\log\mongodb.log #日志输出文件路径
logappend=true #错误日志采用追加模式
journal=true #启用日志文件,默认启用
quiet=true #过滤掉无用的日志信息,若需要调试使用请设置为false
port=27017 #端口号 默认为27017
在Windows系统中使用快捷键“Win+R”,打开“运行”界面,在文本框里面输入“cmd”,点击“确定”,打开一个cmd窗口。
在cmd窗口里面输入如下命令启动MongoDB(如图12所示):
> cd C:\Program Files\MongoDB\Server\6.0
> mongod --dbpath C:\Program Files\MongoDB\Server\6.0\data\db
图12 cmd窗口
打开一个浏览器,输入网址“http://localhost:27017/ ”,如果网页上出现如下一行信息,就说明启动成功了:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
再新建一个cmd窗口,在里面执行如下命令安装MongoDB服务(如图13所示):
> cd C:\Program Files\MongoDB\Server\6.0
> mongod --config "C:\Program Files\MongoDB\Server\6.0\mongo.config" --install --serviceName "MongoDB"
图13 安装MongoDB服务
打开任务管理器(如图14所示),可以看到MongoDB服务正在运行。
图14 任务管理器
这样安装的MongoDB,每次开机都会自动运行。如果要设置为手动运行,可以使用快捷键“Win+R”打开“运行”对话框,输入“services.msc”,会弹出服务管理界面(如图15所示),在所有服务中就可以找到MongoDB服务“MongoDB Server(MongoDB)”,在“MongoDB Server(MongoDB)”双击鼠标左键,会弹出如图16所示界面,可以在“启动类型”里面把“自动”修改为“手动”,这样,以后就需要在开机以后手动启动MongoDB。手动启动MongoDB的方法是,在开机后,打开服务管理界面,如图15所示,然后在“MongoDB Server(MongoDB)”上面单击鼠标右键,在弹出的菜单中点击“启动”即可。
图15 服务管理界面
图16 MongoDB服务配置界面
二、安装MongoDB Shell
在MongoDB6之前,我们配置完环境变量后,可以直接通过终端输入"mongo"进入MongoDB Shell,但MongoDB6没有mong.exe和mongdb.exe,终端输入"mongo"会报错。因此,我们需要自己下载和安装MongoDB Shell。
访问MongoDB Shell下载地址(https://www.mongodb.com/try/download/shell ),下载MongoDB Shell安装文件,比如mongosh-1.6.2-win32-x64.zip。直接把MongoDB Shell安装文件解压缩到MongoDB安装目录下(如图17所示)。然后,参考之前的操作方法,把“C:\Program Files\MongoDB\Server\6.0\mongosh-1.6.2-win32-x64\bin”添加到PATH环境变量中(如图18所示)。
图17 把MongoDB Shell安装文件解压缩到MongoDB安装目录下
图18 设置环境变量
新建一个cmd窗口,在里面执行如下命令进入MongoDB Shell(如图19所示):
> mongosh
图19 MongoDB Shell界面
进入MongoDB Shell模式以后,默认连接的数据库是test数据库,可以在命令提示符“>”后面输入各种Shell命令来操作MongoDB数据库。
可以输入如下命令退出MongoDB Shell模式:
> exit
或者也可以直接按键盘的Ctrl+C组合键,退出Shell命令模式。
三、MongoDB基础操作
1. 常用操作命令
常用的操作MongoDB数据库的相关命令包括:
(1)show dbs:显示数据库列表;
(2)show collections:显示当前数据库中的集合(类似关系数据库中的表table);
(3)show users:显示所有用户;
(4)use yourDB:切换当前数据库至yourDB;
(5)db.help() :显示数据库操作命令;
(6)db.yourCollection.help() :显示集合操作命令,yourCollection是集合名;
MongoDB没有创建数据库的命令,如果要创建一个名称为“School”的数据库,需要先运行“use School”命令,之后做一些操作,比如,使用命令“db.createCollection('teacher')”创建集合,这样就可以创建一个名称为“School”的数据库。
2.简单操作演示
下面以一个School数据库为例进行操作演示,将在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增、删、改、查等基本操作。需要说明的是,文档数据库中的集合(Collection),相当于关系型数据库中的表(table)。
(1)切换到School数据库
命令如下:
> use School
注意,MongoDB无需预创建School数据库,在使用时会自动创建。
(2)创建集合
创建集合(Collection)的命令如下:
> db.createCollection('teacher')
执行上述命令的屏幕截图如图20所示。
图20 创建集合
实际上,MongoDB在插入数据的时候,也会自动创建对应的集合,无需预定义集合。
(3)插入数据
插入数据的具体命令如下:
> db.student.insertOne({_id:1, sname: 'zhangsan', sage: 20}) #_id可选
运行完以上命令,student已自动创建,这也说明MongoDB不需要预先定义集合(collection),在第一次插入数据后,集合会被自动创建。此时,可以使用“show collections”命令查询数据中当前已经存在的集合,如图21所示。
图21 show collections命令执行结果
(4)查找数据
查找数据所使用的基本命令格式如下:
> db.youCollection.find(criteria, filterDisplay)
其中,criteria表示查询条件,是一个可选的参数;filterDisplay表示筛选显示部分数据,如显示指定某些列的数据,这也是一个可选的参数,但是,需要注意的是,当存在该参数时,第一个参数不可省略,若查询条件为空,可用{}做占位符。
(a)查询所有记录
> db.student.find()
该命令相当于关系数据库的SQL 语句“select * from student”。
(b)查询sname='zhangsan'的记录
> db.student.find({sname: 'zhangsan'})
该命令相当于关系数据库的SQL 语句“select * from student where sname='zhangsan'”。
(c)查询指定列sname、sage数据
> db.student.find({},{sname:1, sage:1})
该命令相当于关系数据库的SQL 语句“select sname,sage from student”。其中,sname:1 表示返回sname列,默认_id字段也是返回的,可以添加_id:0 (意为不返回_id),写成{sname: 1, sage: 1,_id:0 },就不会返回默认的_id字段了。
(d)AND条件查询
> db.student.find({sname: 'zhangsan', sage: 20})
该命令相当于关系数据库的SQL 语句“select * from student where sname = 'zhangsan' and sage = 20”。
(e)OR条件查询
> db.student.find({$or: [{sage: 20}, {sage: 25}]})
该命令相当于关系数据库的SQL 语句“select * from student where sage = 22 or sage = 25”。
(5)修改数据
修改数据的基本命令格式如下:
> db.youCollection.updateOne(criteria, objNew, upsert, multi )
对于该命令做如下说明:
(1)criteria:表示update的查询条件,类似sql update查询内where后面的条件;
(2)objNew : update的对象和一些更新的操作符(如$set)等,也可以理解为SQL语句中的update语句中的set后面的内容。
(3)upsert : 如果不存在update的记录,是否插入objNew,true表示插入,默认是false,表示不插入。
(4)multi: MongoDB默认是false,只更新找到的第一条记录,如果这个参数为true,就会把按条件查出来的多条记录全部更新。默认是false,只修改匹配到的第一条数据。
上面各个参数中,其中criteria和objNew是必选参数,upsert和multi可选参数。
这里给出一个实例,语句如下:
> db.student.updateOne({sname: 'zhangsan'}, {$set: {sage: 22}}, false, true)
该命令相当于关系数据库的SQL 语句“update student set sage =22 where sname = 'zhangsan';”。执行该命令的屏幕截图如图22所示。
图22 修改数据
(6)删除数据
> db.student.remove({sname: 'zhangsan'})
该命令相当于关系数据库的SQL 语句“delete from student where sname='chenliu'”。
执行该命令过程的屏幕截图如图23所示。
图23 删除数据
(7)删除集合
> db.student.drop()
四、使用Python操作MongoDB
Python要连接MongoDB需要MongoDB驱动,这里我们使用pymongo驱动来连接MongoDB。打开一个cmd窗口,执行如下命令在Python中安装pymongo模块(如图24所示):
>pip install pymongo -i https://pypi.tuna.tsinghua.edu.cn/simple
图24 安装pymongo
1.测试数据库是否存在
打开IDLE,新建一个Python文件,输入如下代码:
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
if "School" in dblist:print("数据库已存在!")
执行上述代码,就可以验证数据库是否存在。
2.查询某集合下的第一条数据
在MongoDB Shell中执行如下命令创建集合并插入一条数据:
> use School
> db.student.insertOne({_id:1, sname: 'zhangsan', sage: 20})
新建一个Python文件,输入如下代码:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["School"]
mycol = mydb["student"]
record = mycol.find_one()
print(record)
执行上述代码,就可以查询得到集合student下的第一条数据。