- 数据库:在计算机中长期帮应用存储数据的。
数据库分类
-
关系型数据库 : mysql , orcale , sqlserver
关系型数据库最典型的数据结构是表,由二维表机器之间的练习所组成的一个数据组织
优点
:- 易于维护 : 易于维护 : 都是使用表结构,格式一致;Mysql orcale sqlserve都是基于SQL语句的,格式是非常像的。
- 使用方便:SQL语言通用,可用于复杂查询;
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。多表查询,表关联的操作,事务操作,触发器。
缺点
: - 读写性能比较差,尤其是海量数据的高效率读写;操作sql语句,内部非常耗性能。
- 固定的表结构,灵活度稍欠
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
-
非关系型数据库:mongodb、redis …
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。mongodb
-> 文档 类似于JSON的数据 ,数据库底层存储的是 二进制JSON(BSON)
优点
:- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性
- 成本低:nosql数据库部署简单,基本都是开源软件
缺点
: - 不提供sql支持,学习和使用成本较高
- 无事务处理
- 数据结构相对复杂,复杂查询方面稍欠
启动mongodb的具体操作
- 下载 : https://www.mongodb.com/try/download/community
- 把bin目录添加到环境变量中,这样可以全局访问
- 启动数据库 : mongod --dbpath=d:/(自己新建的文件目录) 。 默认端口号:27017
- 可视化工具 : 下载Robo 3T
mongodb操作语法
- show dbs : 查看所有数据库,但是如果这个数据库是空的,是不显示的。local -> 初始是有值的数据库; test -> 空的数据库.
- use [dbname] -> 切换数据库,如果dbname不存在,那么就创建一个数据库,并且切换到这个数据上.
- db.createCollection([collname]) -> 创建一个集合
- db.dropDatabase() : 删除当前数据库
-
具体查看mongodb相关方法 :
- db.help() : 查看数据库的方法
- db.test.help() : 查看test数据库的方法
- db.test.find().help() : 查看find()方法下的方法
-
Collection集合操作 :
- db.createCollection(‘musiclist’) 创建一个集合
- db.getCollection(‘musiclist’) 查看musiclist集合
- db.getCollectionNames() : 查看当前数据下的所有集合
- show collections : 可以查看现在有多少个集合
- db.printCollectionStats() : 查看集合的状态
- db.musiclist.drop() : 删除集合
-
数据库增加方法 :
- db.集合名.insert({}); //单条添加
- db.集合名.insert([{},{},{}]); //多条添加
- db.集合名.insertMany([{},{},{}]); //多条添加
- db.集合名.save({}); //单条添加
- db.集合名.save([{},{},{}]); //多条添加
-
数据库的删除方法 :
- db.集合名.deleteOne({}) 删除一条数据
- db.集合名.deleteMany({}) 删除所有数据
- db.集合名.remove({}) 删除所有数据
- db.集合名.drop() 删除当前集合
-
数据库的修改方法 :
- db.集合名.update({},{$set:{users:“张杰”}})
- s e t − > 修 改 字 段 值 , set -> 修改字段值, set−>修改字段值,inc -> 累加累减字段值(必须是数字类型)
-
数据库查找方法 :
- db.集合名.find() : 查看当前集合的所有数据
- db.集合名.find().count() : 数据的个数
- db.集合名.find({},{name:1,age:1}) : 查询指定字段的数据
- db.集合名.find().sort({age : 1}) 1 升序 -1 降序
- db.集合名.find().skip(10) : 跳过10条
- db.集合名.findOne() : 找一条数据(默认就是第一条)
mongoose
-
Mongoose库简而言之就是对node环境中MongoDB数据库操作的封装。一种对象模型工具,可以将数据库中的数据转换为JavaScript对象供我们使用。对mongodb操作变的简单方便。
-
mongoose是基于promise开发的,所有promise方法都可以使用。
-
下载安装 : npm i -S mongoose
-
引入并创建链接
-
连接数据库 : mongoose.connect(‘mongodb://127.0.0.1:27017/music’, (err)=>{});
-
schema是mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力。
-
model是由schema生成的模型,可以对数据库进行操作。
var express = require('express');
var mongoose = require('mongoose');
const { stringify } = require('querystring');
mongoose.connect('mongodb://localhost:27017/musiclist',{ useNewUrlParser: true , useUnifiedTopology: true },(err)=>{
if(err){
console.log('数据库连接失败!!!');
return;
}
console.log('数据库连接成功!!!');
//3. Schema : 就是规范集合(表)的字段类型和值的。用schema定义集合。
//规范:
//1. 多出规定的字段,是添加不进去这个字段的
//2. 少了规定的字段,整体是可以添加的(默认行为)
//那么如何能规定,必选字段呢? required属性
//如果可选字段的情况下,如何添加默认值呢? default属性
//3. 指定唯一字段的索引值,unique属性
var musicListSchema = mongoose.Schema({
// id: { type: Number, required: true},
musicname: { type: String, unique: true },
musicsiger : String,
sigerage : { type : Number , required : true },
// sigerage : { type : Number },
// date : { type : Date , default : new Date() },
// email : { type : String , unique : true }
// email: { type: String}
})
//4. Model 是由schema生成的模型,可以对数据库进行操作。创建集合。
// 第一个参数:model模型的名字
// 第二个参数:schema对象
// 表的名字会自动创建:
//根据 第一个参数 musicList -> musiclists
//根据 第一个参数 musiclists -> musiclists
// 第三个参数:表的名字(可选项)
var MusicListModel = mongoose.model('musiclist' , musicListSchema , 'mao');
//数据库的添加操作 : 单条
/* MusicListModel({
// id : 1,
musicname: "22",
musicsiger : "毛不易",
sigerage : 26,
}).save().then((res)=>{
console.log(res); // 返回的就是添加成功的这条数据
}).catch((err)=>{
//console.log(err);
if(err){
console.log(err)
console.log('数据添加失败');
}
}); */
//数据库的添加操作 : 多条
/* MusicListModel.insertMany([
{
id : 1,
musicname : "消愁",
musicsiger : "毛不易",
sigerage : 28
},
{
id: 2,
musicname: "像我这样的人",
musicsiger: "毛不易",
sigerage: 28
},
{
id : 3,
musicname : "盛夏",
musicsiger : "毛不易",
sigerage : 28
},
{
id : 4,
musicname: "牧马城市",
musicsiger: "毛不易",
sigerage: 28
},
{
id: 5,
musicname: "借",
musicsiger: "毛不易",
sigerage: 28
},
{
id: 6,
musicname: "不染",
musicsiger: "毛不易",
sigerage: 28
}
]).then((res)=>{
console.log(res); // 返回的就是添加成功的数组格式的数据
}).catch((err)=>{
console.log(err);
}); */
//查询:find()
/* MusicListModel.findOne().then((info)=>{
console.log(info); // 查询一条数据的结构,返回对象类型。
}); */
/* MusicListModel.find({"sigerage":"42"}).then((infos)=>{
console.log(infos); // 查询所有数据,并返回一个数组类型。
}); */
//find的第一个参数:是查询条件,第二个参数:返回指定的字段
/* MusicListModel.find({},{"sigerage":1}).skip(1).limit(3).then((infos)=>{
console.log(infos); // 查询所有数据,并返回一个数组类型。
}); */
//更新数据
/* MusicListModel.update({},{$set : {"musicname":"七里香"}}).then((info)=>{
console.log(info); //
}); */
//删除数据
//删除一条数据
/* MusicListModel.deleteOne({ }).then((info)=>{
console.log(info);
}); */
//删除所有数据
/* MusicListModel.remove().then((info)=>{
console.log(info);
}); */
});
mongodb的增删查改封装
module.exports = {
insert (CollectionName, insertData) {
return new Promise((resolve, reject) => {
// node 错误优先回调原则
CollectionName.insertMany(insertData, (err) => {
if (err) throw err;
resolve()
})
})
},
delete (CollectionName, whereData, deleteNum) {
return new Promise(resolve => {
const deleteType = deleteNum === 1 ? 'deleteMany' : 'deleteOne'
CollectionName[deleteType](whereData, err => {
if (err) throw err;
resolve()
})
})
},
update (CollectionName, whereData, updateData, updateNum) {
return new Promise(resolve => {
const updateType = updateNum === 1 ? 'updateMany' : 'updateOne'
CollectionName[updateType](whereData, updateData, err => {
if (err) throw err;
resolve()
})
})
},
find (CollectionName, whereData, showData) {
return new Promise(resolve => {
CollectionName.find(whereData, showData).exec((err, data) => {
if (err) throw err;
resolve(data)
})
})
},
paging (CollectionName, whereData, showData, count, limitNum) {
limitNum = limitNum || 10
count = count || 1
return new Promise(resolve => {
// 页码 不是从0 开始, 是从1开始,所以要减1
CollectionName.find(whereData, showData).limit(limitNum).skip((count - 1) * limitNum).exec((err, data) => {
if (err) throw err
resolve(data)
})
})
},
count (CollectionName) {
return new Promise(resolve => {
// count() 在某些 版本 不可用
// countDocuments() ok
// estimatedDocumentCount() ok
CollectionName.find().estimatedDocumentCount((err, len) => {
if (err) throw err
resolve(len)
})
})
},
distinct(CollectionName, type) {
return new Promise((resolve) => {
CollectionName.distinct(type).exec((err, data) => {
if (err) throw err
resolve(data)
})
})
}
}