[关闭]
@Wangww0925 2019-08-07T08:06:27.000000Z 字数 7259 阅读 227

了解MongoDB

数据库 MongoDB


mongodb官网

简介

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。目的是为WEB应用提供扩展的高性能的数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

了解关系型数据库和非关系型数据库的区别后,需要有一点的取舍,比较复杂和大型的项目不建议使用非关系型数据库,但是如果你想作个博客,CMS系统这类业务逻辑不复杂的程序,MongoDB是完全可以胜任的。

mongodb 安装 【msi文件】

MongoDB的安装分为Windows下的安装和Mac的安装(Liunx和Mac趋同)。这里我们只讲解windows的安装

1、mongodb官网下载
image_1d2cek1rofcu1eivphi3pg1glt9.png-198.8kB

2、 安装 msi文件
双击 .msi 文件

image_1d2eei3tv1n8q10ckojc1tgd1a8n13.png-156.7kB

image_1d2eej8jun081tur1geo1pbd1nkn1g.png-45.1kB

image_1d2cfor9iibi1pdhslf19mg1sqq13.png-56.4kB
选择custom 自定义安装目录 【安装过程中可以对安装路径进行更改】

PS:Complete是全自动安装,会默认在C盘安装

image_1d2eeqd7p10mb8rt14dik1v1n961t.png-51.8kB
PS:数据库的运行文件的位置和数据库存储的位置不是一回事

image_1d2eerjio104g1ts1nh6872ahp2a.png-32.4kB

image_1d2hn3cbqaqfdm04ja1t4r1i0nm.png-33.8kB
注意: 截图错误,不需要勾选 Install MongoDB Compass

image_1d2eeum6lrif6o563vi01f9b47.png-30.9kB
安装时如果有安全软件,会报一些拦截,一律允许就好,不允许会安装失败的

image_1d2ehidfm33t1igi2cpbamco4k.png-152.7kB

安装完成后的样子
image_1d2ehl02o1hens71ttk20dhtr51.png-123.7kB

3、添加环境变量
将mongo的bin目录[ D:\MongoDB\bin ] 加入到path环境变量中

步骤:
此电脑 右击 -> 属性 -> 高级系统设置
image_1d2eoltji1j4bck1u111u40bjq9.png-110.5kB

选择高级 -> 环境变量
image_1d2eomsrj1ohs7d81r3d1crb1obim.png-44.8kB

用户变量 选择path -> 编辑
image_1d2eooem9102r92u1315bt1k9g13.png-67.7kB

去复制路径
image_1d2eor4fgjjv1angrp5laq1bde1t.png-156.9kB

新建 -> 将路径加入到path环境变量中 -> 确定
image_1d2ep1bjf102i1qt11bn97nhodd4d.png-35.5kB

确定,这个确定一定要点,否则所添加的path变量无效
image_1d2ep27n98jk1a3uagc11s25ur4q.png-67.6kB

为什么要添加环境变量
环境变量添加成功后,可以在系统的任何盘符,使用mongo的命令了,而不需要先指定路径

4、 创建数据目录
以上步骤完成之后,这时我们打开cmd(终端),执行启动命令

  1. mongod

得到如下错误提示
image_1d2gua19511u01n2llic6a65uia4.png-51.4kB

exception in initAndListen: NonExistentPath: Data directory C:\data\db\ not found., terminating 提示 C:\data\db 文件找不到。这说明服务并没有启动,并报了一个exception,服务停止了。这是由于MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完后需要创建它。

创建目录,如下

  1. D:/
  2. MongoDB
  3. bin
  4. conf - 配置文件存放目录
  5. mongod.conf - 【题外话】中会讲解为什么要使用配置文件
  6. data - 数据存放目录
  7. log - 日志存放目录
  8. mongod.log - 日志文件,里面内容可以为空,在MongoDB服务启动后,这个日志文件里会记录服务运行情况

image_1d2f1err814upjik1i64e1i25o64.png-106.9kB

5、MongoDB安装为Windows服务 【简化操作,很关键】
光标定位【D:\MongoDB\bin】 ,执行以下操作

  1. // 在32位操作系统中
  2. mongod --dbpath "D:\MongoDB\data" --logpath "D:\MongoDB\log\mongod.log" --serviceName "MongoDb" --serviceDisplayName "mongodb" --journal --storageEngine=mmapv1 --install
  3. // 在64位系统中
  4. mongod --dbpath "D:\MongoDB\data" --logpath "D:\MongoDB\log\mongod.log" --serviceName "MongoDb" --install --journal

以上命令解析

  1. 必须在管理员的权限下启动
  2. 如果光标挂起,说明数据库开启成功
  3. --dbpath 数据库数据存放目录
  4. --logpath 数据库日志存放目录
  5. --serviceName 服务名称,建议MongoDb
  6. --serviceDisplayName window组件的显示名称,可以跟服务名称不一致
  7. --storageEngine=mmapv1 指定存储格式,64位不需要指定
  8. --install 添加服务 【移除服务,将install改为remove即可】
  9. MongoDb中,有物理文件对应一个个数据库,U盘可以拷走以ns结尾的文件即为数据库。

为什么要简化操作
不简化操作的话,在每次开始mongo命令的同时,也要执行 mongod --dbpath D:\MongoDB\data 命令,并且cmd窗口不能关闭,一旦关闭mongo命令操作就会执行失败

不简化的操作 【此操作不必理会】
光标定位【 D:\MongoDB\bin 】 ,执行以下操作

  1. // 在32位操作系统中
  2. mongod --dbpath D:\MongoDB\data --storageEngine=mmapv1
  3. // 在64位系统中
  4. mongod --dbpath D:\MongoDB\data

以上操作步骤,可以创建n个不同目录下的数据库存储的地方,每次开始数据库都要执行以上操作,比较麻烦。为了简化操作,可以让mongodb成为电脑的服务,那么采用开始mongodb服务每次都能快速启动数据库,并且进入到指定的数据库存储的地方。

这里就不仔细描述 不简化操作 的流程了

6、 查看MongoDB服务
这时,打开 计算机管理的服务列表,可以看到名称为MongoDB的Windows服务已经在里面,但是并没有被启动起来

打开服务列表步骤: 此电脑 右击 -> 管理 -> 服务与应用程序 -> 服务 -> 找到MongoDB
image_1d2f2ekak174j1k3jt7b1e2j1ek6h.png-535.5kB

打开 D:\MongoDB\data 发现多出了很多内容
image_1d2h7fm7vrudaohhgg11lp1364m.png-174.7kB

7、 启动MongoDB服务【必须管理员权限启动】
PS: 使用简化操作就可以直接通过以下命令开启MongoDB服务了

启动mongodb

  1. net start mongodb

关闭mongodb

  1. net stop mongodb

服务开启
image_1d2h7c9do1ofi13apk371n95eg49.png-8.9kB

这时,计算机的服务列表里显示MongoDB服务已经开启。我们还可以点击MongoDB的启动类型,将其设置为手动
image_1d2f56ro91hkqu7j1prqeh01ube7e.png-531.3kB

我们还可以打开 D:\MongoDB\log\mongod.log 日志查看,在日志中我们知道,链接默认端口是27017
image_1d2gqlf6ig4oma71m27s8gtmd7r.png-595.2kB

还可以在浏览器访问 http://localhost:27017/ 可以看到如下
image_1d2gr3b93ruh1dha9pt1f2j1rn28l.png-23.3kB

8、 操作数据库,执行mongo命令
服务端开启后,我们可以使用命令行来链接服务端,链接命令是mongo
执行mongo命令时,也许会报几个warning(警告),我们先不用管它,以后我们再慢慢学习

  1. mongo
  2. db.version()
  3. show dbs

注意: 开启mongodb服务之后还需要使用mongo才能进行操作数据库
image_1d2h82m701lra1nfa1m1s1la2c272t.png-216.5kB

到此,我们可以真正验证MongoDB安装成功了

题外话
重要: 题外话的内容没有经过验证,不能作为参考,只是提下还有配置文件操作

以上安装是在本地安装,如果MongoDB没有安装在本地,我们可以通过配置文件进行操作

mongod.conf 配置文件
mongod.conf 配置文件,里面内容如下:

  1. port=6699
  2. dbpath=D:\MongoDB\data
  3. logpath=D:\MongoDB\log\mongod.log

配置文件里配置了MongoDB服务开启后的端口,数据文件目录,日志存放目录。为mongod.conf的常见基本配置参数释义(简单演示,仅配置上面三项即可):

配置文件 的 配置项

  1. dbpath=../data 数据库数据存放目录
  2. logpath=../logs/mongod.log 数据库日志存放目录
  3. logappend = true 以追加的方式记录日志
  4. port=6699 端口号 默认为27017
  5. fork=true 以后台方式运行进程
  6. auth=true 开启用户认证
  7. nohttpinterface=true 关闭http接口,默认关闭http端口访问
  8. bind_ip = 127.0.0.1 mongodb所绑定的ip地址
  9. journal=true 启用日志文件,默认启用
  10. quiet=true 这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false

批处理文件 .bat
通过一个批处理文件 启动MongoDB配置.bat 配置服务,接着再通过一个批处理文件 启动MongoDB服务.bat 启动MongoDB

启动MongoDB配置.bat,内容如下:

  1. D:
  2. cd D:\MongoDB\bin
  3. mongod -f D:\MongoDB\conf\mongod.conf --journal
  4. pause

启动MongoDB服务.bat,内容如下:
6699 根据实际配置更改
test 根据实际数据库名更改

  1. D:
  2. cd D:\MongoDB\bin
  3. mongo 127.0.0.1:6699/test
  4. pause


MongoDB 命令操作

注意

没有开启服务是无法执行mongo命令

一定要确保在操作数据库之前数据库已经开启了,不能关,不能ctrl+c

一旦这个cmd有问题了,数据库就自动关闭了

集合: 一个数据库里面可以有很多个集合

  1. == 数据库 ==
  2. mongod 开启数据库
  3. mongo 操作数据库
  4. mongoimport 导入数据库
  5. mongodump -d 表名 -o C:// 导出数据库
  6. show dbs 列出所有的数据库
  7. use 数据库名字 使用某个数据库;如果数据库不存在的,则新建一个数据库
  8. db 查看当前所在数据库
  9. db.dropDatabase() 删除当前所在的数据库
  10. db.version() 查看数据库版本
  11. == 集合 ==
  12. show collections 显示当前数据中的集合
  13. db.集合.drop() 删除数据库中的指定集合
  14. db.集合.insert(obj); 当前数据库所在的集合中 插入数据
  15. db.集合.find(find_obj); 当前数据库所在的集合中 查找数据
  16. db.集合.find(find_obj).sort(obj); 当前数据库所在的集合中 查找数据并排序
  17. db.集合.count() 当前数据库所在的集合中 查找所有数据
  18. db.集合.find(find_obj).limit(num); 当前数据库所在的集合中 查找数据并指定num
  19. db.集合.find(find_obj).skip(num); 当前数据库所在的集合中 从第num条开始查找之后所有的数据
  20. db.集合.find(find_obj).skip(num).limit(num1); 当前数据库所在的集合中 从第num条开始查找num1条数据
  21. db.集合.update(find_obj, {$set: update_obj }); 当前数据库所在的集合中 修改数据
  22. db.集合.update(find_obj, new_obj); 当前数据库所在的集合中 替换数据
  23. db.集合.remove(find_obj) 当前数据库所在的集合中 删除数据


创建数据库 use 数据库名

use 数据库名字 : 使用某个数据库;如果数据库不存在的,则新建一个数据库
db : 查看当前所在数据库

  1. use test
  2. db

image_1d2h8q4sp1dlb14l21hia1nkhvmr3n.png-23.2kB

注意: 如果创建的数据库没有集合,show dbs则不会显示创建的数据库,想要显示只需要向数据库中插入一条数据就行


db.集合.insert(obj); 【插入数据】

PS: 第一次使用insert,集合将自动创建,集合中存储的每一条json数据叫做文档

插入一条文档: db.集合.insert(obj);

  1. db.login.insert({name: 'www', pwd: '123456'})

image_1d2h92cqo162e8mq1fsj135vbpk44.png-11.8kB

插入多条文档: db.集合.insert([obj,obj2,...,objn]);

  1. db.login.insert([ {name: 'abc', pwd: '654321'}, {name: 'a', pwd: '123456'} ])

image_1d2h9is64jto1nal1d711gg013e25u.png-23.8kB

导入数据库:mongoimport --db 数据库 --collection 集合 --drop --file 文件

PS:我们不可能一条一条的insert。所以,我们希望用编辑器在外部写好数据库的形式,然后导入数据库:

  1. 以此为例: mongoimport --db test --collection students --drop --file primer-dataset.json
  2. db test 向数据库名为test中导入
  3. collection students 向集合为studens中导入
  4. drop 先把集合清空在添加(可不要,不加的话就是在原有的基础上添加新的内容)
  5. file primer-dataset.json 要导入的文件

db.集合.find(); 【查找数据】

列出该集合的所有文档: db.集合.find()

  1. db.login.find()

image_1d2h9lbol5ld4gdlej15t0h6a6b.png-20.2kB

精确匹配: db.集合.find({属性值: 属性名});

查找名字为aaa的没有数据返回,说明没有找到

  1. db.login.find({name: 'aaa'});
  2. db.login.find({name: 'www'});

image_1d2h9b0tsvnce7dpm11v4m1rp551.png-12.4kB

查找 like 数组 中有 动物 的数据;

  1. db.students.find({"like":"动物"});

查找 like 数组 中下标 1 为 动物 的数据

  1. db.students.find({"like.1":"动物"});

查找 kemu 对象 中 html为一般的数据

  1. db.students.find({"kemu.html":"一般"})

多个条件: db.集合.find({属性值: 属性名, 属性值1: 属性名1, ...});

  1. db.student.find({"name":laowang , "age":12})

条件判断查询: db.集合.find({ "属性值.属性名": {$gt: 条件} });

符号

  1. $gt 大于
  2. $gte 大于等于
  3. $lt 小于
  4. $lte 小于等于

例子

  1. db.student.find({"score.yuwen":{$gt:50}});

或者; db.集合.find({ $or:[ 条件一, 条件二, ... ] });

例子:寻找所有年龄是9岁,或者11岁的学生

  1. db.student.find({$or:[{"age":9},{"age":11}]});

db.集合.find().sort(obj); 【排序】

1表示升序,-1表示降序

例子:表示性别升序之后,年龄降序

  1. db.students.find().sort( { "sex": 1, "age": -1 } )

count(); & limit(num); & skip(num); 【查询集合当中有多少条数据】

查找所有: db.集合.count()

查找指定num条:db.集合.find().limit(num);

从第num条开始查找之后所有的:db.集合.find().skip(num);

从第num条开始查找n条:db.集合.find().skip(num).limit(n);


db.集合.update(find_obj, {$set: update_obj }); 【修改数据】

PS:修改数据时,存在相对应的属性,则修改;不存在相对应的属性,则添加

查找名字叫做小明的,把年龄更改为16岁

  1. db.student.update({"name":"小明"},{$set:{"age":16}});

查找数学成绩是70,把年龄更改为33岁

  1. db.student.update({"score.shuxue":70},{$set:{"age":33}});

更改所有匹配项目:

PS: 如果不指定修改多条数据{multi: true},则只修改第一条数据

  1. db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true});

完整替换,不出现$set关键字了:

PS:将整条数据都替换掉(清空数据->添加)

  1. db.student.update({"name":"小明"},{"name":"大明","age":16});

删除数据

只要匹配成功,就会删除: db.集合.remove(find_obj)

  1. db.restaurants.remove({"borough":"Manhattan"})

只删除一条: db.集合.remove(find_obj, {justOne:true})

  1. db.restaurants.remove({"borough":"Queens"},{justOne:true})

全部删除: db.集合.remove({})


作者 wendy
2019 年 1月 29日

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注