MongoDB
关系型数据库和非关系型数据库
表就是关系
表与表之间存在关系
所有关系型数据库都需要通过SQL
语言来操作
所有关系型数据在操作之前都需要设计表结构
而数据表还支持约束
唯一的
主键
默认值
非空
不需要设计表结构
数据库 -- 数据库
数据表 -- 集合(数组)
表记录 -- (文档对象)
没有结构性,但是也不能乱存,属性之间
安装
配置环境变量
# mongod --version 查看版本 检测安装是否成功
启动和关闭数据库
# mongodb 默认使用执行 mongod命令所处盘符根目录下/data/db 作为自己的数据存储目录
在第一次执行该命令之前先自己手动新建一个 根目录下/data/db
如果想要修改默认的数据存储路径
# mongod -- dbpath=数据存储路径
# ctrl + c 停止服务
连接和退出数据库
连接:
# 该命令默认连接本机的 MongoDB 服务
mongo
退出:
# 在连接状态输入 exit 退出连接
exit
基本命令
-
show dbs
- 查看显示数据库列表
-
use 数据库名称
- 切换到指定的数据库(如果没有会新建)
-
db
- 查看当前操作的数据库
在Node中如何操作MongoDB数据库
使用官方的 mongodb
包来操作
使用第三方 mongoose 来操作MongoDB 数据库
第三方:mongoose
基于MongoDB 官方的 mongodb
包再一次做了封装
mongoose
MongoDB 数据库的基本概念
- 可以有多个数据库
- 一个数据库中可以有多个集合(表)
- 一个集合中可以有多个文档(表记录)
{
qq:{
users:[
{name:"hello",age:18},
{},
{},
{},
{}
],
products:[
]
},
taobao:{
},
school:{
}
}
起步
npm install mongoose
简单调用
const mongoose = require('mongoose');
// 连接本机的数据库:localhost:27017/下的test数据库
// 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
const Cat = mongoose.model('Cat', { name: String });
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
设计 Schema 发布 Model
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test')
var Schema = mongoose.Schema
// 设计集合结构
// 字段名称就是表结构中的属性名称
// 约束的目的是为了保证数据的完整性 保持统一
var userSchema = new Schema({
username: {
type: String,
require: true //必须有 约束
},
password: {
type: String,
require: true
},
email: {
type: String,
require: true
}
})
// 将文档结构f发布为模型
// mongoose.model 方法就是用来将一个架构发布为model
// 第一个参数: 传入一个大写名词单数字符串用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成 小写复数 的集合名称
// 例如User 最终会变为 users
// 第二个参数 架构 Schema
// 返回值 模型构造函数会
var User = mongoose.model('User', userSchema)
增加
// 增加
const admin = new User({
username: 'penny',
password: '123456',
email: 'penny@163.com'
})
// 持久化保存
admin.save(function (error, response) {
if (error) {
console.log('保存失败')
} else {
console.log('保存成功')
console.log(response)
}
})
查询
查询所有
User.find(function (error, response) {
if (error) {
console.log("查询失败")
} else {
console.log(response)
}
})
按条件查询所有
User.find({
username: 'Tom',
// 条件
}, function (error, response) {
if (error) {
console.log("查询失败")
} else {
console.log(response)
}
})
删除数据
根据条件删除所有
User.remove({ username: 'Tom' /*删除数据的条件*/ }, function (error, response) {
if (error) {
console.log('删除失败')
} else {
console.log('删除成功')
console.log(response)
}
})
根据条件删除一个
Model.deleteOne(conditions,[options],[callback])
根据id删除一个
Model.findByIdAndRemove(id,[options],callback)
更新数据
根据条件更新所有
Model.update(conditions,doc,[options],[callback])
根据指定条件更新一个
Model.findOneAndUpdate([conditions],[update],[options],[callback])
根据id更新一个
User.findByIdAndUpdate('5e6efa5251555e0c246bff7d', {
password: '147258369' //条件
}, function (error, response) {
if (error) {
console.log('更新失败')
} else {
console.log('更新成功')
}
})
在Node中操作Mysql
数据库
安装:
npm install --save mysql
配置
var mysql = require('mysql');
// 创建连接
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
// 连接数据库
connection.connect();
// 执行数据库操作
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
// 关闭连接
connection.end();
操作数据
connection.query('Mysql语句 增删改查', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.query('SELECT * FROM `users`', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.query('INSERT INTO users VALUES(NULL,"admin","12456")', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
基本命令
use data //创建数据库data 必须插入一个数据
dv.user.insert({"name":"zhangsan"}) //插入数据 user表
show dbs //查看数据库
show collections //查看数据内有哪些集合和表
db.user.drop() //删除集合,删除表
db.dropDatabase(); //删除数据库 要先在该数据库内删除
db.user.find() //查找所有的数据 相当于 select * from user
db.user,find({"age":13}) //查询age=13的
db.user.find({age:{$gt:22}}) //查询age>22 gt大于
db.user.find({age:{$lt:22}}) //查询<22 lt小于
db.user.find({age:{$gte:25}}) //查询age>=25 gte大于等于
db.user.find({age:{$lte:25}}) //查询age<=25 lte小于等于
de.user.find({age:{$gte:23,$lte:26}}) //查询23>=age>=26
de.user.find({name:/mongo}); //查询name中包含mongo的数据
db.user.find({name:/^mongo/}) //查询name中以mongo开头的
db.user.find({name:/mongo$/}) //查询以mongo结尾的
db.user.find({},{name:1}); //查询name这一列的数据
de.user.find().sort({age:1}) //排序 1 升序
de.user.find().sort({age:-1}) // -1降序
db.user.find().limit(5) //查询前5条数据
db.user.find().skip(10) //查询10以后的数据
db.user.find().count() //查询一共有几条数据
db.user.find().limit(10).skip(5) //可用于分页 从第10条数据开始,走5页
db.user.find({$or:[{age:22},{age"25}]}) //获取 查询age=25或者23
db.user.update({"name":"zhangsan"},{$set:{"age":22}}) //修改name为zhangsan的age为22
db.user.update({"sex":"男"},{$set:{"age":33}},{multi:true}) //更改所有匹配的项目
db.user.update({"name":"zhangsan"},{"name":"wangwu","age":18}) //完整替换
db.user.remove({"age":{$gt22}}) //删除>22的数据
查询优化
explain executionStats
查询具体的执行时间
db.user.find().explain("executionStats")
索引(查询优化)
db.user.ensureIndex({"username":1}) //创建索引
db.user.getIndexes() //获取当前集合的索引
db.user.dropIndex({"username":1})
复合索引
db.user.ensureIndex({"username":1,"age":-1})
基于username和age的查询将会用到该索引,基于username的查询也会用到该索引
基于age的查询将不会用到该索引
唯一索引
db.user.ensureIndex({"username":1},{"unique":true})
账户权限配置
创建超级管理用户
use admin
db.createUser({
user:'admin',
pwd:'123456',
roles:[{role:'root',db:'admin'}]
})
开启权限认证
/bin/mongod.cfg
配置
security:
authorization: enabled
重启mongodb
mongo admin -uername -password
给pennydata
数据库创建一个用户,只能访问pennydata
不能访问其他的数据库
user pennydata
db.createUser({
user:'pennyUser',
pwd:'12456',
roles:[{role:"dbOwner",db:"penntdata"}]
})
查看当前有哪些用户
show user
聚合管道
$project
修改文档的结构,可以用来重命名,增加或者删除文档的字段
查找order只返回文档中 trade_no 和 all_price 字段
db.order.aggregate([
{
$project:{trade_no:1,all_price:1}
}
])
$match
用于过滤文档 (查找all_price
>= 90)
db.order.aggregate([
{
$match:{"all_price":{$gte:90}}
}
])
$group
将集合中的文档进行分组,可用于统计结果
统计每个订单的订单数量,按照订单号分组
db.order.aggregate([
{
$group:{_id:"$order_id",total:{$sum:“$num”}}
}
])
$sort
把筛选到的数据进行排序
db.order.aggregate([
{
$project:{trade_no:1,all_price:1}
},
{
$match:{"all_price":{$gte:90}}
},
{
$sort:{"all_price":1}
}
])
$limit
限制几条数据
db.order.aggregate([
{
$limit:1
}
])
$skip
跳过几条数据
db.order.aggregate([
{
$skip:1
}
])
$lookup 表关联
db.order.aggregate([
{
$lookup:{
form:"order_item", //这里显示和哪个表进行关联
localField:"order_id", //主表关联的id
foreignField:"order_id", //附表关联的id
as:"items" //关联查询完后生成的表名
}
}
])
可以实现以下的效果
[ { order_id:'1', tarde_no:'1', items:[ { title:'数据一', price:20 }, { title:'数据一', price:20 }, { title:'数据一', price:20 }, ]
}
]