【前端】-【MongoDB基础】-学习笔记

28 篇文章 0 订阅
1 篇文章 0 订阅

1 数据库分类

1.1 关系型数据库

例如:MySQL(轻量、免费)、Oracle(非常大、付费)、SQL Server(操作简单,教学比较多)
特点:关系紧密,都是表

优点

  1. 易与维护:都是使用表结构,格式一致
  2. 使用方便:SQL语句通用,可用于复杂查询
  3. 高级查询:可用于一个表以及多个表之间复杂的查询

缺点

  1. 读写性能比较差,尤其是海量数据的高效率读写
  2. 有固定的表结构,字段不可随意更改,灵活性欠佳
  3. 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈

1.2 非关系型数据库NoSQL

例如:MongoDB、Redis
特点:关系不紧密,有文档,有键值对

优点

  1. 格式灵活:存储格式是key,value形式
  2. 速度快:nosql可以内存作为载体,而关系型数据库只能使用硬盘
  3. 易用:nosql数据库部署简单

缺点

  1. 不支持sql,学习和使用成本较高
  2. 不支持事务(跟钱有关系的都不用)
  3. 复杂查询时语句过于繁琐 对

2 MongoDB

2.1 简介

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
在这里插入图片描述

2.2 安装

  1. 下载地址:https://www.mongodb.com/try/download/community
  2. 安装
  3. 添加到系统环境变量(如果不添加,没有mongod命令)
  4. 在C盘创建data文件夹里面再创建一个db文件夹 C:\data\db
  5. 启动mongodb服务器命令:mongod,mongodb默认的端口:27017,等待连接

打开一个新的命令行窗口,输入mongo命令,就连接成功了
默认保存在 C:\data\db ,设置mongodb数据库的存储路径:mongod --dbpath 路径

2.3 配置服务

配置 MongoDB 为服务,以后不需要在命令行里面启动,自动启动在这里插入图片描述

可以使用MongoDB Compass图形化使用MongoDB
下载地址 https://www.mongodb.com/try/download/compass

常见端口号:
在这里插入图片描述

http 80 https443 MySQL3306

3 MongoDB使用

在这里插入图片描述

  • 数据库 database
  • 集合(数组) collection
    类似与SQL中的数据表,本质上是一个数组,里面包含看多个文档对象,[{},{},{}]
  • 文档对象 document
    类似与SQL中的记录,一个文档对象{}就是一条记录

菜鸟教程https://www.runoob.com/mongodb/mongodb-tutorial.html

3.1 简单操作命令

db 查看当前操作的数据库
show dbs :查看所有的数据库
use test :切换到指定的test数据库
show collections:查看当前数据库中所有的集合
db.collectionName.insert():在当前数据库的collectionName集合中插入一个文档

例如:db.student.insert( {name:'liu',age:18,sex:'男'}

3.2 MongoDB_GUI工具 (studio 3T)

下载地址:https://studio3t.com/download/
在这里插入图片描述

这个工具可以连接多个数据库
当前电脑:localhost、127.0.0.1

4 MongoDB原生CRUD(增删改查)

4.1 C-creat 新增数据

db.collectionName.insert( {name:'liu'} ) 插入一条数据
db.collectionName.insertOne( {name:'liu'} ) 插入一条数据
db.collectionName.insertMany( [ {name:'ykyk'} , {name:'ykyk123'} ] )插入多条数据

4.2 R-read查询数据

查询数据find
db.collectionName.find()查询集合所有的文档,即所有的数据。查询到的是整个数组对象。在最外层是有一个对象包裹起来的。
db.collectionName.find({name:"hhh"})条件查询。结果返回的是一个【数组】,可以在后面直接取索引下标
db.collectionName.find({name:"hhh"},{stu_id:1,grade:1,_id:0})条件查询,只返回年级和学生id
_id可以0和1混用,其他的只能是0或者1
db.collectionName.findOne() 查找第一个。效率更高。(比如身份证号,手机号)

查询操作符:

  1. 比较
    $gt 大于>
    $gte 大于等于>=
    $lt 小于<
    $lte 小于等于<=
    $ne 不等于!=
    $eq 等于的另一种写法=
  2. 逻辑或$or,$in
    $or 或者 db.students.find({$or:[{age:18},{age:19}]});
    $in 或者 db.students.find({age:{$in[18,20]}}); 【记住】
  3. 逻辑非: $nin
    db.students.find({age:{$nin[18,20]}});
  4. 正则:
    举例:db.students.find({name:/^T/})
  5. $where能写函数:
 db.students.find({$where:function(){
		return this.name==='zhangsan' && this.age===18
}})

4.3 U-update更新数据

db.collectionName.update(查询条件,要更新的内容[,配置对象])

db.users.update({name:'zhangsan'},{age:19}) 会替换掉整个文档对象,但_id不受影响
db.users.update({name:'zhangsan'},{$set:{age:19}}) 使用$set修改指定内容,其他数据不变,不过只能匹配一个zhangsan
db.users.update({name:'zhangsan'},{$set:{age:19}},{multi:true}) 修改多个文档对象,匹配多个zhangsan,年龄都替换成19【记住】

补充:update默认与updateOne()等效,即对于匹配到的文档只更改其中的第一个
updateMany()可以用来更改匹配到的所有文档

db.students.updateMany({name:'ykky'},{age:21,gender:222}})

4.4 D-delete删除数据

【一般不会删除】

 db.collectionName.remove(查询条件)  

db.students.remove({name:'zhangsan}) 删除名字是zhangsan的

5 连接数据库Mongoose

非关系型数据库:对象文档模型:ODM(object doument model)

5.1 Mongoose简介

Mongoose 是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供更多的功能。

5.2 Mongoose优势

  1. 可以为文档创建一个模式结构(Schema)
  2. 可以对模型中的对象/文档进行验证
  3. 数据可以通过类型转换为对象模型
  4. 可以使用中间件来应用业务逻辑挂钩
  5. 比Node原生MongoDB驱动更容易

为什么用Mongoose?
想在Node平台下,简单、高效、安全、稳定的操作

安装:npm i mongoose
在引入第三方库时,如果本文件夹内没有找到node_modules,找外层文件夹,直到根目录

连接数据库

# 引入mongoose
let mongoose=require('mongoose')

# 连接mongodb数据库
mongoose.connect('mongodb://localhost:27017/demo',{
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
# 监听mongodb数据库的连接状态
mongoose.connection.on("open", function(err) => {
  if(err){
  	console.log("数据库连接失败!",err);
  }else{
  	console.log("数据库连接成功");
  	console.log("操作数据库");
  }	
});

5.3 连接数据库并创建Schema对象和Model对象

let mongoose=require('mongoose')
mongose.set('useCreateIndex',ture)//使用一个新的索引创建器
mongoose.connect('mongodb://localhost:27017/demo',{
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
mongoose.connection.on("open", function(err) => {
  if(err){
  	console.log("数据库连接失败!",err);
  }else{
  	console.log("数据库连接成功");
  	#1 保安---- 引入模式对象
  	let Schema = mongoose.Schema;
  	#2 指定规则 -----创建约束对象
  	let stuSchema== new Schema({
  		stu_id:{
  			type:String,
  			required:true, //限制学号是必填
  			unique:true //限制学号唯一
  		},
  		name:{
  			type:String,
  			required:true, 
  		},
  		age:{
  			type:Number,
  			required:true, 
  		},
  		habby:[String],//限制爱好必须为数组,数组中每一项都是字符串
  		info:Schema.Types.Mixed,//接收所有类型
  		date:{
  			type:Date,
  			default:Date.now()
  		},
  		enable_flag:{
  			type:String,
  			default:'Y'
  		}
  	})
  	#3 告诉保安你的规则----创建模型对象
  	let stuModel=mongoose.model('students',stuSchema)//用于生成某个集合所对应的模型对象
  }	
});

5.4 Mongoose的CRUD(增删改查)

  1. 添加操作
# 4 真正有人要进入你家了 ----- 添加
stuModel.create({
	stu_id:'001',
	name:'张三',
	age:18,
	habby:['吃饭','睡觉','敲代码'],
	info:66666,
	},function(err,data){
		if(!err) console.log(data);
		else console.log(err);
	})
})
  1. 查询操作

find()方法:

  1. 返回一个数组,就算一个文档也包裹一个数组
  2. 若为空,返回空数组

findOne()方法:

  1. 若有结果,返回一个对象
  2. 若为没有结果,返回null
# 4 真正有人要进入你家了 ----- 查询
stuModel.find({
	stu_id:'001',
	},function(err,data){
		if(!err) console.log(data);
		else console.log(err);
	})
})
  • 查询 只要年龄
stuModel.find({name:'班长'},{age:1,_id:0},function(err,data){
		if(!err) console.log(data);
		else console.log(err);
	})
})
  1. 更新操作

update():即将被弃用,建议用后两个
updateOne()
updateMany()

# 4 真正有人要进入你家了 ----- 更新
stuModel.update({stu_id:'001'},{age:6},function(err,data){
		if(!err) console.log(data);
		else console.log(err);
	})
})
  1. 删除操作

delete()
deleteMany()

# 4 真正有人要进入你家了 ----- 删除
stuModel.delete({age:6},function(err,data){
		if(!err) console.log(data);
		else console.log(err);
	})
})

5.5 模块化处理

  1. 数据库连接,文件db/db.js
let mongoose=require('mongoose')
mongose.set('useCreateIndex',ture)//使用一个新的索引创建器

const DB_NAME='demo'
const POST=27017
const IP='localhost'

function connetMongo(callback){
	mongoose.connect('mongodb://localhost:27017/demo',{
	  useNewUrlParser: true,
	  useUnifiedTopology: true,
	});
	mongoose.connection.once("open", function(err) => {
	  if(err){
	  	console.log("数据库连接失败!",err);
	  	callback('connet failed')
	  }else{
	  	console.log("数据库连接成功");
	  	callback();
	  }
	})
}
module.exports = connetMongo
  1. 创建模型对象 model/stuModel.js
let mongoose=require('mongoose')
#1 保安---- 引入模式对象
let Schema = mongoose.Schema;
#2 指定规则 -----创建约束对象
let stuSchema== new Schema({
	stu_id:{
		type:String,
		required:true, //限制学号是必填
		unique:true //限制学号唯一
	},
	name:{
		type:String,
		required:true, 
	},
	age:{
		type:Number,
		required:true, 
	},
	habby:[String],//限制爱好必须为数组,数组中每一项都是字符串
	info:Schema.Types.Mixed,//接收所有类型
	date:{
		type:Date,
		default:Date.now()
	},
	enable_flag:{
		type:String,
		default:'Y'
	}
})
#3 告诉保安你的规则----创建模型对象
model.exports = mongoose.model('students',stuSchema)//用于生成某个集合所对应的模型对象
  	
  1. 在最终的文件 app.js
let mongoose = require('mongoose')
let db = require('./db/db') //引入连接数据库
let stuModel = require('./model/stuModel') //引入
db(function(err){
	if(err) console.log(err)
	else{
		stuModel.create({
			stu_id:'001',
			name:'张三',
			age:18,
			habby:['吃饭','睡觉','敲代码'],
			info:66666,
			},function(err,data){
				if(!err) console.log(data);
				else console.log(err);
			})
		})
	}
})
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值