数据库概念
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
数据库介绍
- 存储数据的仓库,独立于语言之外的软件,可以通过api去操作它
- 生活中
- 通过仓库来存放物品,每个仓库有N个架子, 每个架子有N个物品
- 在程序中
- 通过数据库来存放数据, 每个数据库有N个表/集合,每个表/集合有N个数据/文档
数据库种类
-
关系型数据库
- 遵循统一的SQL标准,语法大同小异
- 有库和表的约束等
- Oracle、 MySql、 SQLite、 SQL Server等
-
非关系型数据库(Not Only SQL)
- 没有统一的标准
- 一般以键值对形式存储
- 读取速度更快
- Mongodb(文档)、Redis/Memcache(内存)
为什么使用数据库
- 动态网站的数据都存储于数据库中
- 可以持久存储客户端通过表单收集的用户信息
- 可以对数据进行高效的管理
MongoDB中的相关术语
-
database: 数据库,mongodb中可以建立多个数据库
-
collection:集合,一组数据的集合,可以理解为js中的数组
-
document:文档,一条具体的数据, 可以理解为js中的对象
-
field:字段,可以理解为js中的对象属性
field —> document —> collection —> database
目标
- 存放项目数据
- 实战工作中可以独立写api接口
MongoDB安装步骤
-
linux环境
-
下载mongodb(linux)安装包(通过winScp工具将安装包从window移动到linux)
-
远程工具连接linux(putty等)
-
移动到安装包的目录解压安装包
tar -zxvf mongodb-linux-x86_64-xxxxx.tgz -
将解压包移动到指定目录
mv mongodb-linux-x86_64-xxxx/ /user/local/mongodb -
创建数据存放目录与日志存放目录
mkdir -p /user/local/mongodb/data /user/local/mongodb/logs -
启动MongoDB服务
/user/local/mongodb/bin/mongod --dbpath=/user/local/mongodb/data --logpath=/user/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork -
后期登录即可
/user/local/mongodb/bin/mongo
-
-
window环境
-
下载mongodb(window)安装包并解压
-
创建服务(dos命令窗口中移动至安装包的安装路径)
bin/mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径 -
启动服务(在mongodb的bin目录 **=》 以管理员身份运行)
net start mongodbnet stop mongodb -
登录(在mongodb的bin目录 ****》 也可以直接配置环境变量)
mongo
-
MongoDB基本操作
查看数据库
show databases
选择数据库
use 数据库名
注意:在mongodb中选择不存在的数据库时不会报错**(隐式创建)**,当这个数据库中有内容后会展示
查看当前选择的数据库
db
删除数据库
db.dropDatabase()
删除当前选择的数据库
查看集合
show collections
创建集合
db.createCollection('集合名')
注意: 后期插入数据都是隐式创建集合
删除集合
db.xxx.drop()
mongodb文档增删改查
数据库主要用来存放项目数据, 数据库和集合的创建完成之后需要对文档(数据)进行增删改查
插入文档
-
语法
db.集合名.insert(json数据)集合若存在,则直接插入数据,若集合不存在,则隐式创建
-
练习:在test2数据库的c1集合中插入数据(名字叫yuweiqi 年龄18岁)
use test2db.c1.insert({ name: "yuweiqi", age: 18}) // mongodb会给每一条文档加一个全球唯一的_id键
- 可以给每条数据自定义_id **但是强烈不推荐**
- 只要在插入数据的时候加上自定义的_id既可覆盖
- 插入多条数据
```javascript
db.c1.insert([
{name: "zhangsan", age: 18},
{name: "zhaosi", age: 19},
{name: "wangwu", age: 20}]
)// 一次性插入三条数据
-
如何快速插入多条数据
因为mongodb底层使用的是js引擎实现的,所以支持部分js语法
因此可以写for循环
for(var i = 0; i < 10; i++) { db.c1.insert({name: "a"+ i, age: i}) }
删除文档
-
语法
db.集合名.remove(条件, [,是否删除一条])是否删除一条:true 删除全部匹配的 false 删除一条(默认)
修改文档
-
基础语法
db.集合名.update(条件,新数据[,是否新增, 是否修改多条])是否新增: 根据条件匹配不到数据时是否插入该条数据 true为插入 false为不插入(默认)是否修改多条: 将匹配成功的数据都修改 true 是 false 否(默认) -
升级语法
db.集合名.update(条件,{修改器:{键:值}})| 修改器 | 作用 | | ———- | ———— | | rename | 重命名列 | | unset | 删除列 |
-
准备工作
for(var i = 1; i <= 10; i++) { db.c2.insert({uname: "zs"+i, age: i}) } 在test2数据库的c2集合中插入10条数据 -
练习1:将{uname: zs1}改为{uname: zs2}
db.c2.update({uname: "zs2"}, {$set: {uname: "zs22"} }) -
练习2:将{uname: zs10}的年龄增加两岁或者减小两岁
db.c2.update({uname: "zs10"}, {$inc: {age: 2} }) 增加两岁db.c2.update({uname: "zs10"}, {$inc: {age: -2} }) 减小两岁 -
练习3:插入数据: db.c2.insert({uname: “升龙教主”,age: 888, who: “男”, other:“非国人”})
```` db.c2.update({uname: “升龙教主”}, {set: {uname: “升龙大教主”} }) 修改uname的值 db.c2.update({uname: “升龙大教主”}, {rename: {who: “sex”} }) 修改who字段的字段名 db.c2.update({uname: “升龙大教主”}, {inc: {age: 111} }) age字段的值增加111 db.c2.update({uname: “升龙大教主”}, {unset: {other: true} }) 删除other字段
// 一次性写多个修改器db.c2.update({uname: "升龙大教主"}, { $set: {uname: "升龙大教主"}, $rename: {who: "sex"}, $inc: {age: 111}, $unset: {other: true}}````
查询文档
-
语法
db.集合名.find(条件[,查询的字段])// 1.条件: 查询所有的数据 ---> {}或者不写 查询 age=6 的数据 ---> {age: 6} 查询age=6 同时 sex = "男"的数据 ---> {age: 6, sex: "男"} 2.查询的字段(可选参数) 不写 ---> 查询符合条件数据的所有字段 {age: 1} ---> 只显示符合条件数据的age字段 {age: 0} ---> 不显示符合条件数据的age字段(其他字段都显示) 但是不管怎么写 系统自定义的_id都会显示| 条件 | 含义 | | :—- | :——————- | | lt | 小于 | | lte | 小于等于 | | in | 包含(查询多个) | | $nin | 不包含 |
-
练习1:查询所有的数据
db.c1.find({}) -
练习2:查询年龄大于5岁的数据
db.c1.find({age: {$gt: 5} }) -
练习3:查询年龄是5岁、8岁、10岁的数据
db.c1.find({age: {$in: [5, 8, 10]} }) -
练习4:只看年龄列(_id不考虑)
db.c1.find({},{age:1})