分类
关系型数据库
高度组织化结构化数据,数据和关系都存储在单独的表中,SQL语言划分成不同的模块语句进行操作
以社交、搜索为代表的互联网业务产生海量数据时,关系型数据库在扩展性(需要负责技术sharding来实现)、高昂的表变更成本、高并发容量、写入延迟等方面都面对很多挑战。
非关系型数据库(No SQL)
Not Only SQL
存储方式有更多的选择:"键-值"对存储,列存储,文档存储,图形数据库等,没有声明性查询语言,没有预定义的模式,非结构化和不可预知的数据,高性能,高可用性和可伸缩性。
- MongoDB
- 键值对数据库
- 文档数据库MongoDB
= 》mangodb可视化工具1
= 》可视化工具2
贴个大佬链接:从数据结构出发对比关系型数据库和文档型数据库
MongoDB简介
为快速开发互联网web应用而设计
- 极简、灵活
数据模型面向文档的,即BSON(类似于JSON),就是各种JSON,可以放一些二进制数据
- bin目录配置环境
- 创建data/db
- cmd中打开MongoDB服务器
mongod
mongod -dbpath 路径 -port 端口号
- 另一个cmd窗口链接服务器
mongo
要素
- database 数据库
- collection 集合
- documents 文档
数据库和集合可以在文档创建时自动创建
基本操作
show dbs
show databases # 展示当前所有数据库
use 数据库名
db # 当前数据库
show collections # 显示数据库中所有集合
数据库CRUD操作
- 插入文档
如果插入时没有指定 ‘_id’ 属性,数据库会自动添加
自己制定_id需要注意保证唯一性
db.<collection>.insert(doc)
- 查询
db.<collection>.find()
db.<collection>.find().count() # 数量
db.<collection>.find({_id:"example"}) # 查询_id那个文档
db.<collection>.findOne() # 查询符合条件的第一个文档
- 修改
$set – 修改文档指定属性
$unset – 删除指定属性
db.<collection>.update(查询条件, 新对象) # 注意:默认使用新对象替换就对象
db.<collection>.updateMany(a,b)
db.<collection>.updateOne(a,b)
db.<collection>.replacOne()
db.<collection>.update(查询条件,
{$set:{age:28}}) # 仅修改操作符指定
- 删除文档
db.<collection>.remove({}) # 根据条件删除文档
db.<collection>.deleteOne()
db.<collection>.deleteMany()
文档间的关系
一对一
- 夫妻
内嵌文档
一对多
- 父子
简单举例就是,在多个文档中用一个属性去对应单个文档
people
[{name:'Liming', age:40}]
children
[{name:'Limi', father:'Liming'}
{name:'Lilei', father:'Liming'}
{name:'Wangge', father:'Wanglaoji'}]
两个孩子找父亲
father_name = db.people.findOne({name:'Liming'}).name
db.children.find({father:father_name})
多对多
分类与商品
上面的例子也可以用
Liming离婚了,又有了小孩
Limi和Lilei变成了fathers
[
{name:'Liming', age:40},
{name:'Wanglaoji', age:45}]
[
{name:'Limi', fathers:['Liming', 'Wanglaoji']}
{name:'Lilei', fathers:['Liming', 'Wanglaoji']}
{name:'Wangge', father:'Wanglaoji'}
{name:'Lili', father:'Liming'}]
看着有点纠结~~~~
排序、投影
sort 指定文档排序的规则
- 1升序;-1降序
limit,skip,sort可以以任意顺序调用
# 按sal的升序排列
db.<collection>.find({}).sort({sal:1})
# 投影,1显示,0消失
db.<collection>.find({},{name:1, _id:0})
mongoose
对象文档模型(ODM)库,对Node原生的MOngoDB进行优化封装,提供更多功能,简单来说,就是用对象的方式操作数据库
- 为文档创建一个约束,比如字段、数据类型等
- 对模型的对象\文档进行验证
新的对象
按顺序创建
- Schema(模式对象),定义了数据库的文档结构
- Model,对应数据库的集合
- Document
一些实际操作
内嵌文档
文档的属性值是一个文档
db.users.update({username:'swk'},
{$set:{hobby:{citys:['shanxi','sichaun'],
food:['xiangjiao','苹果']}
}
})
支持通过内嵌文档的属性进行查询,但属性名必须加引号
// 查询喜欢食物有苹果的人
db.users.find({"hobby.food":"苹果"})
加入新的食物
// $push,数组加入新元素
// $addToSet 也行
db.users.update({username:'swk'}, {$push:{"hobby.food":"橘子"}})
**
大数量
先放入arr数组,后插入数据库
var arr=[]
for(var i=1;i<=100;i++){
arr.push({num:i})
}
db.numbers.insert(arr)
(更新ing)