文档型数据库,数据接口BSON,最像关系型数据库的非关系型数据库
一、sql数据库与nosql数据库区别
数据类型
应用场景:社交、游戏、物流、物联网、视频直播
数据量大 tb pb
写入操作频繁
价值比较低,对事物性要求不高
不适合复杂join
适合水平扩展
优点:
1、高性能
2、高可用
3、高扩展
4、丰富的查询
二、nosql数据库分类
1、键值数据库
2、列存储数据库
3、文档型数据库
4、图形数据库
三、启动
配置环境变量
启动服务
mongod --dbpath D:MongoDB
客户端链接服务端
mongo ip:27017
mongo admin -u 用户名 -p 密码
mongo 127.0.0.1:27017/test -u user -p 123456
show dbs 查看有哪些数据库
show collections 查看数据库中的表
use admin
show users 查看有哪些用户
查询表数据
db.user.find()
and
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"})
db.user.find({"age":{$lte:30,$gte:20}})
or
db.user.find({$or:[{"age":20},{"age":10}]})
模糊查询
db.user.find({name:/张/})
以张开头的
db.user.find({name:/^张/})
指定列查询 只查询name 列
db.user.find({},{name:1})
排序
升序
db.user.find({}).sort({"age":1})
降序
db.user.find({}).sort({"age":-1})
分页查询5条数据
db.user.find({}).limit(5)
查询从第几条到第几条
从第3条开始查询5条
db.user.find().skip(2).limit(5)
db.user.find().skip(0).limit(5)
查询条数
db.user.find().count()
更新表数据
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
不加条件 改第一条
db.user.update({},{$set:{'age':5}})
不加set 替换
db.col.update({'title':'MongoDB 教程'},{'title':'MongoDB'})
删除表 集合
db.user.drop()
删除数据库
db.dropDatabase()
删除数据 删除年龄等于30的数据
db.user.remove({"age",30})
查询集合的索引
db.user.getIndexes()
删除索引
db.user.dropIndex({"name":1})
查看查询语句的执行
db.user.find().explain("executionStats")
设置索引 给name列设置索引
db.user.ensureIndex({"name":1})
设置复合索引 name索引按升序存储,age索引按降序存储
db.user.ensureIndex({"name":1,"age":-1})
唯一索引 值必须唯一 类似主键
db.user.ensureIndex({"userid":1},{"unique":true})
四、mongo权限
可以给每一个库设置管理员
创建超级管理员
1、use admin
2、
db.createUser({
user:'admin',
pwd:'123456',
roles:[{role:'root',db:'admin'}]
})
db 是指哪个库
3、修改配置文件
bin/mongod.cfg
security:
authorization:enabled
//查看当前库下的用户
show users
删除用户
db.dropUser("aaa")
修改用户密码
db.updateUser("admin",{pwd:"1212"})
密码认证
db.auth("admin","password")
五、数据库表与表的关系
1、一对一的关系
2、一对多的关系
3、多对多的关系
六、聚合管道:对集合中的文档进行变换和组合
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
只查询trade_no,all_price列 并且条件为all_price>=90的数据
db.user.aggregate([
{
$project:{trade_no:1,all_price:1}
},
{
$math:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":-1}
},
{
$limit:1
}
])
分组
db.user.aggregate([
{
$group:{_id:"$order_id",total:{$sum:"$price"}}
}
])
_id total
1 9
表关联
db.order.aggregate([
{
$lookup:
{
from:"order_item",
localField:"order_id",
foreignField:"order_id",
as:"items"
}
}
])
七、数据库的导入导出
导出
mongodump -h dbhost -d dbname -o dbdirectory
mongodump -h 127.0.0.1:21070 -d test -o c:/path
导入:
monorestore -h dbhost -d dbname path