Mongodb
为什么选mongodb 因为操作语法与js类似,容易上手学习成本低。
其实,mysql我也会,嘿嘿。
1.0 安装
网址: www.mongodb.com/try/downloa…
下载 版本5.0.18 msi格式的然后一路安装
2.0 mongoose
mongoose 是一个对象文档模型库, 中文官网 www.mongoosejs.net/docs/index.…
作用: 方便使用代码操作 mongodb 数据库
2.1使用流程
// 1.0 先新建一个文件
// 然后 npm init -y 初始化文件
// 2.0 安装
npm install mongoose
// 3.0 连接数据库
// 1.0 导入mongoose
const mongoose = require('mongoose')
// 2.0 连接 mongodb 服务
mongoose.connect('mongodb://localhost:27017/bilibili')
// 后面的bilibili是数据库名称 没有的话会创建
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
})
// 连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败')
})
// 设置关闭连接的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭')
})
// 关闭数据库
// setTimeout(()=>{
// mongoose.disconnect()
// })
3.0 插入文档
// 1.0 导入mongoose
const mongoose = require('mongoose')
// 2.0 连接 mongodb 服务
mongoose.connect('mongodb://localhost:27017/bilibili')
// 后面的bilibili是数据库名称 没有的话会创建
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('books',BookSchema)
// 7.0 新增
BookModel.create({
name: '西游记',
author: '吴承恩',
price: 19.9
}).then(res=>{
console.log('我是成功的',res)
}).catch(err=>{
console.log('我插入失败',err)
})
})
// 连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败')
})
// 设置关闭连接的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭')
})
3.1字段类型
| 类型 | 描述 |
|---|---|
| String | 字符串 |
| Number | 数字 |
| Boolean | 布尔值 |
| Array | 数组,也可以用 [ ] 来标识 |
| Date | 日期 |
| Buffer | Buffer对象 |
| Mixed | 任意类型,需要使用 mongoose.Schema.Types.Mixed指定 |
| ObjectId | 对象ID,需要使用 mongoose.Schema.Types.ObjectId指定 |
| Decimal128 | 高精度数字,需要使用 mongoose.Schema.Types.Decimal128指定 |
用法
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
tags: Array,
create_time: Date,
test: mongoose.Schema.Types.Mixed, // 任意类型
// test2: mongoose.Schema.Types.ObjectId, // 文档id
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('books',BookSchema)
// 7.0 新增
BookModel.create({
name: '西游记',
author: '吴承恩',
price: 19.9,
is_hot: true,
tags:['励志','鬼怪','宴请'],
create_time: new Date(),
test: {name:1,age:2}
}).then(res=>{
console.log('我是成功的',res)
}).catch(err=>{
console.log('我插入失败',err)
})
})
3.2字段值验证
mongoose 有一些内建验证器,对字段值进行验证
必填项
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: {
type: String,
required: true, // 必填
unique: true,// 设置为独一无二的值
},
author:{
type: String,
default: '匿名',// 默认值
},
sex:{
type: String,
enum: ['男','女'] // 枚举值必需在这里面填写
},
age:Number,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('books',BookSchema)
// 7.0 新增
BookModel.create({
name:'小明',
age:18,
sex:'女'
}).then(res=>{
console.log('我是成功的',res)
}).catch(err=>{
console.log('我插入失败',err)
})
})
3.3删除文档
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 删除一条数据
// BookModel.deleteOne({_id:'6489c2b9054b91c76cffbd74'}).then(res=>{
// console.log('删除成功',res) // 删除成功 { acknowledged: true, deletedCount: 1 }
// }).catch(err=>{
// console.log('删除失败',err)
// })
// 批量删除
BookModel.deleteMany({is_hot:false}).then(res=>{
console.log('删除成功',res)
}).catch(err=>{
console.log('删除失败',err)
})
})
3.4更新文档
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 更新一条文档
// BookModel.updateOne({name:'二'},{price:35}).then(res=>{
// console.log('更新成功',res)
// }).catch(err=>{
// console.log('更新失败',err)
// })
// 批量更新
BookModel.updateMany({name:'二'},{price:34}).then(res=>{
console.log('更新成功',res)
}).catch(err=>{
console.log('更新失败',err)
})
})
3.5读取文档
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 读取一条文档
// BookModel.findOne({name:'二'}).then(res=>{
// console.log('读取成功',res)
// 读取成功 {_id: new ObjectId("6489c2b9054b91c76cffbd75"), name: '二', author: '人跟我', price: 34, is_hot: true, __v: 0}
// }).catch(err=>{
// console.log('读取失败',err)
// })
// 根据id获取文档
// BookModel.findById('6489c2b9054b91c76cffbd75').then(res=>{
// console.log('读取成功',res)
// }).catch(err=>{
// console.log('读取失败',err)
// })
// 读取批量文档
// BookModel.find({name:'二'}).then(res=>{
// console.log('读取成功',res)
// }).catch(err=>{
// console.log('读取失败',err)
// })
// 读取所有文档内容
BookModel.find().then(res=>{
console.log('读取成功',res)
}).catch(err=>{
console.log('读取失败',err)
})
})
3.6条件控制
运算符mongodb 不能使用 > < >= != 等运算符,需要使用替代符号
| 运算符号 | 替代符号 | |
|---|---|---|
| > | $gt | |
| < | $lt | |
| >= | $gte | |
| <= | $lte | |
| !== | $ne | db.students.find(id:{$gt:3}) // id大于3的所有记录 |
| || | $or | db.students.find( $or:[{age:18},{age:24}] ) // 查询年龄等于18或者24的 |
| && | $and | db.students.find( and: [{age:{lt:20}},{age:{$gt15}}] ) // 查询年龄大于15并且年龄小于20的 |
| 正则匹配 | 可以模糊查询 | db.students.find( { name : /imissyou/ } ) |
demo
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 查询价格小于20的书
// BookModel.find({price:{$lt:20}}).then(res=>{
// console.log('检索成功',res)
// }).catch(err=>{
// console.log('检索失败',err)
// })
// 查询 书名里面有 二的数据
BookModel.find({name: /二/}).then(res=>{
console.log('检索成功',res)
}).catch(err=>{
console.log('检索失败',err)
})
})
我发现上面有很多重复的代码 比如
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
我感觉这一段经过后面的学习一定会去掉
3.7条件控制
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 查询价格小于20的书
// BookModel.find({price:{$lt:20}}).then(res=>{
// console.log('检索成功',res)
// }).catch(err=>{
// console.log('检索失败',err)
// })
// 查询 书名里面有 二的数据
BookModel.find({name: /二/}).then(res=>{
console.log('检索成功',res)
}).catch(err=>{
console.log('检索失败',err)
})
})
3.8个性查找
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
console.log('连接成功')
// 5.0 创建文档的结构对象 Schema 结构
// 设置文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
is_hot: Boolean,
})
// 6.0 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('novel',BookSchema)
// 7.0 只要 name 和 author 1表示要展示 0表示不展示 比如默认有_id 给个0 就不展示了
// BookModel.find().select({name:1,author:1}).then(res=>{
// console.log('检索成功',res)
// }).catch(err=>{
// console.log('检索失败',err)
// })
// 8.0 根据价格排序 1升序 0降序
// BookModel.find().sort({price:1}).then(res=>{
// console.log('检索成功',res)
// }).catch(err=>{
// console.log('检索失败',err)
// })
// 9.0 数据截断 skip 跳过 limit 限定
// 升序的价格的前 3条
// BookModel.find().sort({price:1}).limit(3).then(res=>{
// console.log('检索成功',res)
// }).catch(err=>{
// console.log('检索失败',err)
// })
// 升序的价格的 第10到13条
BookModel.find()
.sort({price:1})
.skip(10)
.limit(3)
.then(res=>{
console.log('检索成功',res)
}).catch(err=>{
console.log('检索失败',err)
})
})
4.0 代码模块化
代码拆分利于复用
文件结构
--mongoModel 根文件
----config 数据库配置文件
|
config.js
----db 连接数据库文件夹
|
db.js
----dbModels 数据库模块文件
|
donghuaModel.js 动画模块
movieModel.js 电影模块
----donghua.js 动画操作文件
----index.js 电影操作文件
1.0 config.js
// 配置文件
module.exports = {
DBHOST: '127.0.0.1', // 主机地址
DBPORT: 27017, // 端口
DNNAME: 'bilibili'
}
2.0 db.js
module.exports = function (success ,error){
/*
* success 成功的回调
* error 失败的回调
* */
// 判断 error 为其设置默认值
if(typeof error !== 'function'){
error = ()=>{
console.log('连接失败~~')
}
}
// 1.0 导入mongoose
const mongoose = require('mongoose')
// 导入配置文件
const { DBHOST,DBPORT,DNNAME } = require('../config/config')
// 2.0 连接 mongodb 服务
mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DNNAME}`)
// 3.0 设置回调
// 连接成功的回调
mongoose.connection.once('open',()=>{
success()
})
// 连接错误的回调
mongoose.connection.on('error',()=>{
error()
})
// 设置关闭连接的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭')
})
}
3.0 donghuaModel.js
// 导入 mongoose
const mongoose = require('mongoose')
// 创建文档的结构对象 Schema 结构
let donghuaSchema = new mongoose.Schema({
name: String,
country: String,
})
// 创建模型对象, 对文档操作的封装对象 books 是集合名称
let donghuaModel = mongoose.model('donghuas',donghuaSchema)
module.exports = donghuaModel
4.0 movieModel.js
// 导入 mongoose
const mongoose = require('mongoose')
// 创建文档的结构对象 Schema 结构
let BookSchema = new mongoose.Schema({
name: String,
author: String,
})
// 创建模型对象, 对文档操作的封装对象 books 是集合名称
let BookModel = mongoose.model('movies',BookSchema)
module.exports = BookModel
5.0 donghua.js
// 创建一个动画集合
// 导入db文件
const db = require('./db/db')
const donghuaModel = require("./dbModels/donghuaModel");
db(()=>{
// 新增
donghuaModel.create({
name: '艾则',
country: '日本',
}).then(res=>{
console.log('我是成功的',res)
}).catch(err=>{
console.log('我插入失败',err)
})
});
6.0 index.js
// mongo 电影模块化文件
// 导入db文件
const db = require('./db/db')
// 导入模型对象
const BookModel = require('./dbModels/movieModel')
db(()=>{
// 新增
BookModel.create({
name: '西游记',
author: '吴承恩',
}).then(res=>{
console.log('我是成功的',res)
}).catch(err=>{
console.log('我插入失败',err)
})
})
无论做什么,记得为自己而做,那就毫无怨言。