MongoDB数据库基础
## 数据库
- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
- 分类
- 关系型数据库(sql):Access mySql SqlServer oracle db2等。
- 非关系型数据库( NoSql ): MongoDB,Redis,HBase,CouchDB等。
- 非关系型数据库的优势:
- 1.性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高
- 2.可扩展性:基于键值对,数据之间没有耦合性,非常容易水平扩展
- 关系型数据库的优势:
- 1.复杂查询:可以用SQL语句方便的在多个表之间做非常复杂的数据查询。
- 2.事务支持:使得对于安全性能很高的数据访问要求得以实现。
- 非关系型数据库的优势:
- NoSQL
- NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
- NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
关系型数据库是由表和表之间的关系组成的,nosql是由集合组成的,集合下面是很多的文档。
非关系型数据库文件存储格式为BSON(一种JSON的扩展)。
MongoDB
-
简介
-
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
-
MongoDB 是非关系型数据库当中功能最丰富,最像关系型数据库的。
-
MongoDB中数据类型为: bson
- bson就是json的超集,可以存储二进制【 图片 视频 音频 】,简称Binary JSON
- 和JSON一样,支持内嵌的文档对象和数组对象,但是**BSON有JSON没有的一些数据类型,**如Date和BinData类型。
- 优点:灵活性高。
- 缺点:空间利用率不理想
- 特点:轻量性、可遍历性、高效性
-
-
优点
- 面向集合存储,易存储对象类型的数据。
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性。
- 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言
- 文件存储格式为BSON(一种JSON的扩展)
MongoDB的安装
MongoDB官网地址:
https://www.mongodb.com/
MongoDB下载地址:
https://www.mongodb.com/download-center#community
可视化工具:Robo 3T
-
基本操作
-
1.以管理员身份运行cmd
cd到安装目录下面的bin文件夹下
-
2.设置环境变量
path变量值最后加上分号 ;C:\Program Files\MongoDB\Server\4.0\bin(如果是在这个目录下)
-
3.创建文件夹(如果存在data/log目录,就可以不做)
-
A、在d盘建立一个文件夹mongodb,并且建立子目录db和log.
B、在log目录下建立一个文件MongoDB.log ,后缀为.log.
d:\mongodb\db、d:\mongodb\log, 分别用来存放数据库文件和数据库日志文件.
C、把mongodb文件夹的只读属性去掉。
-
-
4.启动MongoDB
- 以管理员身份运行cmd
- 在dos命令界面执行mongod --storageEngine mmapv1 --dbpath “d:\mongodb\db” --logpath “d:\mongodb\log\MongoDB.log”
- 执行后,就挂起了,需要另外开命令窗口测试是否启动成功。
- 测试连接
- 原来的cmd窗口不关闭,以管理员身份再开一个cmd窗口,输入mongo或mongo.exe
- 测试成功后,输入exit或ctrl+c可退出
- 以管理员身份运行cmd
-
5.将MongoDB安装为windows服务
-
原因:当mongod.exe被关闭时,mongo.exe 就无法连接到数据库了,因此每次想使用mongodb数据库都要开启mongod.exe程序,所以比较麻烦,此时我们可以将MongoDB安装为windows服务
-
步骤:
-
以管理员身份运行cmd,进入bin文件夹下,执行
mongod --storageEngine mmapv1 --dbpath “d:\mongodb\db” --logpath “d:\mongodb\log\MongoDB.log” --install --serviceName “MongoDB”
这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务名为MongoDB
-
启动mongodb服务
- net start MongoDB
- 出现服务已经启动成功后,再次测试连接
mongo
即可进入MongoDB。
-
关闭服务和删除进程
- 先ctrl+c
- 再关闭服务:net stop MongoDB
-
-
-
MongoDB的基础使用
-
常用命令
- help 查看帮助
- show dbs 显示数据库列表
- use dbname 创建或者切换数据库
- 创建的数据库并不在数据库的列表中,要显示它,我们需要向数据库dbname插入一些数据
- MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
- show collections 显示数据库中的集合
-
增加数据
-
db.web.save({name:“name”})
- 创建了web集合,并增加一条数据
-
db.web.insert({name:“ghost”,age:10})
- 在web集合中插入一条数据,如果没有web集合,MongoDB会自动创建
-
save()和insert()的区别:
-
若新增的数据主键已经存在,insert()会不做操作并提示错误,而save() 则更改原来的内容为新内容。
-
存在数据:{ _id : ObjectId(“57e8d34b4764fb71d0a89caa”), " name " : " 老李"} ,_id是主键
insert({ _id : ObjectId(“57e8d34b4764fb71d0a89caa”), " name " : " 老王 " }) 会提示错误
save(ObjectId(“57e8d34b4764fb71d0a89caa”), " name " : " 老王 " }) 会把 “老李” 改为 “ 老王” ,有update的作用。
-
-
-
删除数据
- db.web.remove({})
- 删除web集合下所有数据
- db.web.remove({“name”:“ghost”})
- 删除web集合下name="ghost"的数据
- db.web.drop() 或者 db.runCommand({“drop”:“web”})
- 都是删除web集合
- db.runCommand({“dropDatabase”:1})
- 删除当前数据库
- db.web.remove({})
-
查找数据
- db.web.find()
- 查找集合web中的所有数据
- db.web.findOne()
- 查找集合web中的第一条数据
- db.web.find().pretty()
- 格式化查询到的数据
- db.web.find()
-
修改数据
-
db.web.update({name:’“aaa”’},{$set:{sex:“women”}},true,true)
-
参数: 第一个参数是查找条件
第二个参数是修改内容,主键不能修改
第三个参数表示匹配所有符合条件的的数据
第四个参数表示修改所有匹配到的数据
-
-
MongoDB的高级命令
-
条件查找
- db.webs.find({“key”:“value”})
- 查找key为value的数据
- db.webs.find({ “key” : { $gt: value } })
- 查找key大于value的数据
- db.webs.find({ “key” : { $lt: value } })
- 查找key小于value的数据
- db.webs.find({ “key” : { $gte: value } })
- 查找key大于等于value的数据
- db.webs.find({ “key” : { $lte: value } })
- 查找key小于等于value的数据
- db.webs.find({ “key” : { gt:value1,gt : value1,gt:value1,lt : value2 } } )
- 查找key大于value1小于value2的数据
- db.webs.find({ “key” : { $ne:value } } )
- 查找key不等于value的数据
- db.webs.find({ “key” : { $mod : [ 10 , 1 ] } })
- 取模运算,条件相当于key % 10 == 1 即key除以10余数为1的数据
- db.webs.find({ “key” : { $in: [ 1, 2, 3 ] } })
- 属于,条件相当于key等于[ 1, 2, 3 ]中任何一个的数据
- db.webs.find({ “key” : { $nin: [ 1, 2, 3 ] } })
- 不属于,条件相当于key的值不属于[ 1, 2, 3 ]中任何一个的数据。
- db.webs.find({ “key” : { $size: 1 } })
- $size 数量、尺寸,条件相当于key对应的值的数量是1(值必须是数组)的数据
- db.webs.find({ “key” : { $exists : true|false } })
- $exists 字段存在,true返回存在字段key的数据,false返回不存在字段key的数据
- db.webs.find({ $or : [{a : 1}, {b : 2} ] })
- 符合其中任意一个条件的数据
- db.webs.find({“key”:“value”})
-
排序
- db.webs.find().sort({ “key1” : -1 ,“key2” : 1 })
- 对查询到的数据先进行key1字段降序排列,再按key2字段升序排列
- db.webs.find().sort({ “key1” : -1 ,“key2” : 1 })
-
其他
-
db.webs.find().skip(i)
- 从下标为i的地方开始截取数据
-
db.webs.find().limit(i)
- 从0截取i个数据
-
db.webs.find().count()
- 返回结果集条数
-
sort()排序优先级高于skip(),所以无论在前后,都先执行sort()
-