Mongodb

236 阅读5分钟

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 包来操作

github.com/mongodb/nod…

​ 使用第三方 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			},		]
	}
]