@Wangww0925
2019-08-07T08:06:27.000000Z
字数 7259
阅读 227
数据库
MongoDB
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。目的是为WEB应用提供扩展的高性能的数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
了解关系型数据库和非关系型数据库的区别后,需要有一点的取舍,比较复杂和大型的项目不建议使用非关系型数据库,但是如果你想作个博客,CMS系统这类业务逻辑不复杂的程序,MongoDB是完全可以胜任的。
MongoDB的安装分为Windows下的安装和Mac的安装(Liunx和Mac趋同)。这里我们只讲解windows的安装
2、 安装 msi文件
双击 .msi 文件
选择custom 自定义安装目录 【安装过程中可以对安装路径进行更改】
PS:Complete是全自动安装,会默认在C盘安装
PS:数据库的运行文件的位置和数据库存储的位置不是一回事
注意: 截图错误,不需要勾选 Install MongoDB Compass
安装时如果有安全软件,会报一些拦截,一律允许就好,不允许会安装失败的
安装完成后的样子
3、添加环境变量
将mongo的bin目录[ D:\MongoDB\bin ] 加入到path环境变量中
步骤:
此电脑 右击 -> 属性 -> 高级系统设置
选择高级 -> 环境变量
用户变量 选择path -> 编辑
去复制路径
新建 -> 将路径加入到path环境变量中 -> 确定
确定,这个确定一定要点,否则所添加的path变量无效
为什么要添加环境变量
环境变量添加成功后,可以在系统的任何盘符,使用mongo的命令了,而不需要先指定路径
4、 创建数据目录
以上步骤完成之后,这时我们打开cmd(终端),执行启动命令
mongod
得到如下错误提示
exception in initAndListen: NonExistentPath: Data directory C:\data\db\ not found., terminating
提示 C:\data\db
文件找不到。这说明服务并没有启动,并报了一个exception,服务停止了。这是由于MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完后需要创建它。
创建目录,如下
D:/
MongoDB
bin
conf - 配置文件存放目录
mongod.conf - 【题外话】中会讲解为什么要使用配置文件
data - 数据存放目录
log - 日志存放目录
mongod.log - 日志文件,里面内容可以为空,在MongoDB服务启动后,这个日志文件里会记录服务运行情况
5、MongoDB安装为Windows服务 【简化操作,很关键】
光标定位【D:\MongoDB\bin】 ,执行以下操作
// 在32位操作系统中
mongod --dbpath "D:\MongoDB\data" --logpath "D:\MongoDB\log\mongod.log" --serviceName "MongoDb" --serviceDisplayName "mongodb" --journal --storageEngine=mmapv1 --install
// 在64位系统中
mongod --dbpath "D:\MongoDB\data" --logpath "D:\MongoDB\log\mongod.log" --serviceName "MongoDb" --install --journal
以上命令解析
必须在管理员的权限下启动
如果光标挂起,说明数据库开启成功
--dbpath 数据库数据存放目录
--logpath 数据库日志存放目录
--serviceName 服务名称,建议MongoDb
--serviceDisplayName window组件的显示名称,可以跟服务名称不一致
--storageEngine=mmapv1 指定存储格式,64位不需要指定
--install 添加服务 【移除服务,将install改为remove即可】
在MongoDb中,有物理文件对应一个个数据库,U盘可以拷走以ns结尾的文件即为数据库。
为什么要简化操作
不简化操作的话,在每次开始mongo命令的同时,也要执行 mongod --dbpath D:\MongoDB\data
命令,并且cmd窗口不能关闭,一旦关闭mongo命令操作就会执行失败
不简化的操作 【此操作不必理会】
光标定位【 D:\MongoDB\bin 】 ,执行以下操作
// 在32位操作系统中
mongod --dbpath D:\MongoDB\data --storageEngine=mmapv1
// 在64位系统中
mongod --dbpath D:\MongoDB\data
以上操作步骤,可以创建n个不同目录下的数据库存储的地方,每次开始数据库都要执行以上操作,比较麻烦。为了简化操作,可以让mongodb成为电脑的服务,那么采用开始mongodb服务每次都能快速启动数据库,并且进入到指定的数据库存储的地方。
这里就不仔细描述 不简化操作
的流程了
6、 查看MongoDB服务
这时,打开 计算机管理的服务列表
,可以看到名称为MongoDB的Windows服务已经在里面,但是并没有被启动起来
打开服务列表步骤: 此电脑 右击 -> 管理 -> 服务与应用程序 -> 服务 -> 找到MongoDB
打开 D:\MongoDB\data
发现多出了很多内容
7、 启动MongoDB服务【必须管理员权限启动】
PS: 使用简化操作就可以直接通过以下命令开启MongoDB服务了
启动mongodb
net start mongodb
关闭mongodb
net stop mongodb
服务开启
这时,计算机的服务列表里显示MongoDB服务已经开启。我们还可以点击MongoDB的启动类型,将其设置为手动
我们还可以打开 D:\MongoDB\log\mongod.log 日志查看,在日志中我们知道,链接默认端口是27017
还可以在浏览器访问 http://localhost:27017/
可以看到如下
8、 操作数据库,执行mongo命令
服务端开启后,我们可以使用命令行来链接服务端,链接命令是mongo
执行mongo命令时,也许会报几个warning(警告),我们先不用管它,以后我们再慢慢学习
mongo
db.version()
show dbs
注意: 开启mongodb服务之后还需要使用mongo才能进行操作数据库
到此,我们可以真正验证MongoDB安装成功了
题外话
重要: 题外话的内容没有经过验证,不能作为参考,只是提下还有配置文件操作
以上安装是在本地安装,如果MongoDB没有安装在本地,我们可以通过配置文件进行操作
mongod.conf 配置文件
mongod.conf 配置文件,里面内容如下:
port=6699
dbpath=D:\MongoDB\data
logpath=D:\MongoDB\log\mongod.log
配置文件里配置了MongoDB服务开启后的端口,数据文件目录,日志存放目录。为mongod.conf的常见基本配置参数释义(简单演示,仅配置上面三项即可):
配置文件 的 配置项
dbpath=../data 数据库数据存放目录
logpath=../logs/mongod.log 数据库日志存放目录
logappend = true 以追加的方式记录日志
port=6699 端口号 默认为27017
fork=true 以后台方式运行进程
auth=true 开启用户认证
nohttpinterface=true 关闭http接口,默认关闭http端口访问
bind_ip = 127.0.0.1 mongodb所绑定的ip地址
journal=true 启用日志文件,默认启用
quiet=true 这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
批处理文件 .bat
通过一个批处理文件 启动MongoDB配置.bat
配置服务,接着再通过一个批处理文件 启动MongoDB服务.bat
启动MongoDB
启动MongoDB配置.bat,内容如下:
D:
cd D:\MongoDB\bin
mongod -f D:\MongoDB\conf\mongod.conf --journal
pause
启动MongoDB服务.bat,内容如下:
6699 根据实际配置更改
test 根据实际数据库名更改
D:
cd D:\MongoDB\bin
mongo 127.0.0.1:6699/test
pause
注意
没有开启服务是无法执行mongo命令
一定要确保在操作数据库之前数据库已经开启了,不能关,不能ctrl+c
一旦这个cmd有问题了,数据库就自动关闭了
集合: 一个数据库里面可以有很多个集合
== 数据库 ==
mongod 开启数据库
mongo 操作数据库
mongoimport 导入数据库
mongodump -d 表名 -o C:// 导出数据库
show dbs 列出所有的数据库
use 数据库名字 使用某个数据库;如果数据库不存在的,则新建一个数据库
db 查看当前所在数据库
db.dropDatabase() 删除当前所在的数据库
db.version() 查看数据库版本
== 集合 ==
show collections 显示当前数据中的集合
db.集合.drop() 删除数据库中的指定集合
db.集合.insert(obj); 当前数据库所在的集合中 插入数据
db.集合.find(find_obj); 当前数据库所在的集合中 查找数据
db.集合.find(find_obj).sort(obj); 当前数据库所在的集合中 查找数据并排序
db.集合.count() 当前数据库所在的集合中 查找所有数据
db.集合.find(find_obj).limit(num); 当前数据库所在的集合中 查找数据并指定num条
db.集合.find(find_obj).skip(num); 当前数据库所在的集合中 从第num条开始查找之后所有的数据
db.集合.find(find_obj).skip(num).limit(num1); 当前数据库所在的集合中 从第num条开始查找num1条数据
db.集合.update(find_obj, {$set: update_obj }); 当前数据库所在的集合中 修改数据
db.集合.update(find_obj, new_obj); 当前数据库所在的集合中 替换数据
db.集合.remove(find_obj) 当前数据库所在的集合中 删除数据
use 数据库名字 : 使用某个数据库;如果数据库不存在的,则新建一个数据库
db : 查看当前所在数据库
use test
db
注意: 如果创建的数据库没有集合,show dbs则不会显示创建的数据库,想要显示只需要向数据库中插入一条数据就行
PS: 第一次使用insert,集合将自动创建,集合中存储的每一条json数据叫做文档
db.login.insert({name: 'www', pwd: '123456'})
db.login.insert([ {name: 'abc', pwd: '654321'}, {name: 'a', pwd: '123456'} ])
PS:我们不可能一条一条的insert。所以,我们希望用编辑器在外部写好数据库的形式,然后导入数据库:
以此为例: mongoimport --db test --collection students --drop --file primer-dataset.json
db test 向数据库名为test中导入
collection students 向集合为studens中导入
drop 先把集合清空在添加(可不要,不加的话就是在原有的基础上添加新的内容)
file primer-dataset.json 要导入的文件
db.login.find()
查找名字为aaa的没有数据返回,说明没有找到
db.login.find({name: 'aaa'});
db.login.find({name: 'www'});
查找 like 数组 中有 动物 的数据;
db.students.find({"like":"动物"});
查找 like 数组 中下标 1 为 动物 的数据
db.students.find({"like.1":"动物"});
查找 kemu 对象 中 html为一般的数据
db.students.find({"kemu.html":"一般"})
db.student.find({"name":laowang , "age":12})
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
db.student.find({"score.yuwen":{$gt:50}});
例子:寻找所有年龄是9岁,或者11岁的学生
db.student.find({$or:[{"age":9},{"age":11}]});
1表示升序,-1表示降序
db.students.find().sort( { "sex": 1, "age": -1 } )
查找所有: db.集合.count()
查找指定num条:db.集合.find().limit(num);
从第num条开始查找之后所有的:db.集合.find().skip(num);
从第num条开始查找n条:db.集合.find().skip(num).limit(n);
PS:修改数据时,存在相对应的属性,则修改;不存在相对应的属性,则添加
db.student.update({"name":"小明"},{$set:{"age":16}});
db.student.update({"score.shuxue":70},{$set:{"age":33}});
PS: 如果不指定修改多条数据{multi: true},则只修改第一条数据
db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true});
PS:将整条数据都替换掉(清空数据->添加)
db.student.update({"name":"小明"},{"name":"大明","age":16});
db.restaurants.remove({"borough":"Manhattan"})
db.restaurants.remove({"borough":"Queens"},{justOne:true})
作者 wendy
2019 年 1月 29日