数据库概念
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
数据库介绍
- 存储数据的仓库,独立于语言之外的软件,可以通过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既可覆盖
-
插入多条数据
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(条件,{修改器:{键:值}})
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$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都会显示
条件 | 含义 |
---|---|
$gt | 大于 |
$lt | 小于 |
$gte | 大于等于 |
$lte | 小于等于 |
$ne | 不等于 |
$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})