MongoDB简介
就是一个数据库,将数据存储在磁盘文件中
MongoDB下载:https://www.mongodb.com/download-center/community
数据库种类:
关系型:MySQL、SQL Server 、Oracle等
非关系型(Not Only SQL):MongoDB(文档)、Redis/Memcache(内存)
关系型数据库和非关系型数据库(NoSQL)区别:
相同点:都是数据库
不同点:
关系型:
1.遵循SQL标准,换句话说增删改查语法大同小异、
2.有库和表约束等
非关系型:
1.没有标准、
2.一般键值对形式存储、
3. 读取速度更快
MongoDB存储方式
MongoDB是文档型数据库,文件以BSON格式存储在硬盘中。
注意:BSON是JSON的一种二进制形式的存储格式
小总结
什么是mongodb :就是一个数据库,磁盘文件(BSON 二进制JSON 底层是JS引擎)
mongodb能干吗:存放网站数据
MongoDB的安装与使用
创建MongoDB 服务
n 前 提:现在安装目录下创建data目录,用于后期存放数据
n 创建服务:bin/mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径
n 删除服务:bin/mongod.exe --remove
n 启动服务:net start mongodb (注:service 服务名d restart/stop/start)
n 关闭服务:net stop mongodb
注意:此处打开cmd窗口输入bin/mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径,一定要以管理员身份打开cmd,否则后面输入net start mongodb启动服务就会报错,还有安装的目录名及文件都不能有中文和空格,空格,空格,空格一定注意。
连接MongoDB服务器
语法:mongo.exe 服务器ip地址:端口/数据库 (注:默认test数据库)
简写:mongo.exe
MongoDB默认端口:27017
mongoDB每次使用都需进入 bin文件下下 操作麻烦
解决办法; 配置环境变量
此电脑 右键单击=> 属性 => 高级系统设置 => 环境变量
小总结
步骤1(安装):双击傻瓜式下一步
步骤2(创建服务)
- 用管理员身份运行DOS窗口
- 切换到安装目录/bin
- mongod.exe --install --dbpath 磁盘目录 --logpath 磁盘路径
- 去服务查看win+r 【services.msc】
步骤3(启动服务):net start mongodb
步骤4(登录):mongo
非win系统(Linux、mac)
Llinux
#步骤1:下载
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
#步骤2:解压
tar -zxvf mongodb-linux-x86_64-3.0.6.tgz
#步骤3:将解压包拷贝到指定目录
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
#步骤4:创建数据存放目录与日志存放目录
mkdir -p /usr/local/mongodb/data /usr/local/mongodb/logs
#步骤5:启动MongoDB服务
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
#后期登录即可
/usr/local/mongodb/bin/mongo
mac
步骤1:进入/usr/local
cd /usr/local
步骤2:下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
步骤3:解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
#步骤4:重命名
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
#步骤5:创建数据存放目录与日志存放目录
sudo mkdir -p /usr/local/mongodb/data /usr/local/mongodb/logs
#步骤6:启动MongoDB服务
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
#后期登录即可
/usr/local/mongodb/bin/mongo
Mongodb基本操作
Mongodb和Mysql的区别:
MySQL数据库中有:数据库(database)、表(table)、记录(row) MongoDB数据库中有:数据库(database)、集合(collection)、文档(document) JSON ---------------------------------------------------------------------------------------- MongoDB中的集合相当于MySQL中的表,但是集合没有列的限制,体现了模式自由。 MongoDB内部执行引擎为JS解释器,把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的JS语法来操作。 db.xxx来操作
查看数据库
命令:show databases
选择数据库
命令:use 数据库名
效果
注意:如果被选择的数据库不存在,后期当该数据库有数据时,系统会自动创建出该数据库(隐式创建)
查看集合
命令:show collections
效果:
创建集合
命令:db.createCollection(‘集合名’)
效果
注意:创建集合相当于mysql创建表,mongoDB中的集合相当于mysql中的表
删除集合
命令:db.集合名.drop()
效果:
思考:如何删除数据库?
回答:1通过use语法选中数据库,2通过db.dropDatabase()删除数据库
小总结
数据库(查看、创建、选择、删除)
查看:show databases 创建:有单独的语法,但是忽略 隐式创建 选择:use 数据库名 删除:1通过use选中数据库,2通过db.dropDatabase()删除数据库
集合(查看、创建、删除)
查看:show collections 创建:db.createCollection('集合名') 多学一招:忽略 后期插入数据 隐式创建集合 删除:db.集合名.drop()
MongoDB数据增删改查(CURD !!!)
C增加数据
**命令:**db.集合名.insert(JSON数据)
**说明:**集合存在-则直接插入数据,集合不存在-隐式创建
**练习:**在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)
use test2 db.c1.insert({uname:"webopenfather", age:18}) 留心1:数据库和集合不存在都隐式创建 留心2:对象的键统一不加引号方便看,但是查看集合数据时系统会自动加 留心3:mongodb会给每条数据增加一个全球唯一的_id键
多学一招:_id的组成
想要自定义ID,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐
db.c1.insert({_id:1, uname:“webopenfather”, age:18})
想要一次性插入多条记录,需要传递数据,数组中写一个个JSON数据即可
db.c1.insert([
{uname:"z3", age:3},
{uname:"z4", age:4},
{uname:"w5", age:5}
])
含义:一次性插入3条数据到c1集合
如何快速插入10条数据?
回答:mongodb底层使用JS引擎实现的,所以支持部分js语法
因此:可以写for循环
for (var i=1; i<=10; i++) {
print(i)
}
需求:在test2数据库c2集合中插入10条数据,分别为 a1 a2 ... a10
use test2
for (var i=1; i<=10; i++) {
db.c2.insert({uanme: "a"+i, age: i})
}
R查看数据
**基础语法:**db.集合名.find(条件 [,查询的列])
条件
查询所有数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别=男 {age:6,sex:‘男’}
查询的列(可选参数
不写 - 这查询全部列(字段
{age:1} 只显示age列(字段
{age:0} 除了age列(字段都显示
留心:不管你怎么写系统自定义的_id都会在
升级语法
db.集合名.find({键:值}) 注:值不直接写 {运算符:值} db.集合名.find({ 键:{运算符:值} })
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in 留心:值就写[1,2,3,4] |
$nin | not in |
练习1:查询所有数据
练习2:查询年龄大于5岁的数据?
练习3:查询年龄是5岁、8岁、10岁的数据?
练习4:只看年龄列,或者年龄以外的列(_id别管它)
U修改数据
基础语法: db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])
是否新增:指条件匹配不到数据则插入(true是插入,false否不插入默认) 是否修改多条:指将匹配成功的数据都修改(true是,false否默认)
升级语法
说明:
是否新增:指匹配不到数据则插入(true-是插入,false-否不插入默认)
是否修改多条:将匹配成功的数据都修改(true-是,false-否默认)
db.集合名.update(条件, 新数据)
{修改器: {键:值}}
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
准备工作
use test2;
for(var i = 1; i<= 10; i++){
db.c3.insert( {"uname":"zs"+i,"age":i} );
}
练习1:将{uname:“zs1”}改为{uname:“zs2”}
发现:默认不是修改,而是替换
解决:使用升级语法 修改器
需求:使用修改器将zs4的姓名改为zs44
语法:db.c3.update({uname:“zs4”}, {KaTeX parse error: Expected 'EOF', got '}' at position 21: …{uname: "zs44"}}̲) ![在这里插入图片描述](…set)
age 增加 111 (修改器:$inc)
who 改字段 sex (修改器:$rename)
other 删除 (修改器:$unset)
语法分析:
db.c4.update({age:888}, { $set: {uname: "webopenfather"} })
$inc: {age: 111}
$rename: {who: "sex"}
$unset: {other: true}
db.c4.update({age:888}, {
$set: {uname: "webopenfather"},
$inc: {age: 111},
$rename: {who: "sex"},
$unset: {other: true}
})
练习4:验证语法最后两个参数(了解)
【验证】是否新增true是false否:修改uame 等于 zs30的年龄 30岁
【验证】是否修改多条true是,false否默认
D删除数据
语法:db.集合名.remove(条件 [, 是否删除一条] )
注意:是否删除一条 true是,false否 默认
小总结
高级开发攻城狮统称:所有数据库都需要增删改查CURD标识
MongoDB删除语法:remove
增Create
db.集合名.insert(JSON数据)
删Delete
db.集合名.remove(条件 [,是否删除一条true是默认false删除所有])
改Update
db.集合名.update(条件, 新数据 [,是否新增true是false否默认,是否修改多条true是false否默认])
升级语法: db.集合名.update(条件,{ 修改器:{键:值} })
查Read
db.集合名.find(条件 [,要显示的列])
升级语法: db.集合名.find({ 键:{运算符:值} } )
其他命令
- Help查看命令提示
db.help()
db.集合名.help()
db.集合名.find().help()
- 显示当前db状态
db.stats()
- 当前db版本
db.version()
- 查看当前db的链接机器地址
b.getMongo()
■MongoDB排序&分页
需求
从数据库获取数据 需要排序 、多页展示如何实现?
数据准备:
use test3 //建库
db.c1.insert({_id:1,name:"a",sex:1,age:1}) //
db.c1.insert({_id:2,name:"a",sex:1,age:2}) //
db.c1.insert({_id:3,name:"b",sex:2,age:3}) //
db.c1.insert({_id:4,name:"c",sex:2,age:4}) //
db.c1.insert({_id:5,name:"d",sex:2,age:5}) //插入数据
db.c1.find() //查看数据
排序
-
语法:db.集合名.find().sort(JSON数据)
-
说明:键-就是要排序的列/字段、值:1 升序 、 -1 降序
-
练习:年龄升序&降序
Limit与Skip方法 -
语法:db.集合名.find().sort().skip(数字).limit(数字)
-
说明:skip跳过指定数量(可选),limit限制查询的数量
-
练习:1-降序查询查询2条,2-降序跳过2条并查询2条
实战分页
需求:数据库 1 - 10数据,每页显示两条(5页)
语法:db.集合名.find().skip().limit(2)
skip计算公式:(当前页 - 1) * 每页显示条数 1页 1 2 0 2页 3 4 2 3页 5 6 4 4页 7 8 6 5页 9 10 8
小总结
db.集合名.find()
.sort({列: 1/-1}) 排序
.skip(数字) 跳过指定数量
.limit(数字) 限制查询条数
.count() 统计总数量
不够:百度或谷歌