MongoDB的学习
一、准备
新建一个文件夹,在控制台输入npm init -y
来创建package.json
的包,新建index.js
作为我们的入口文件,再新建好tools
、models
、controller
三个文件夹,其中,tools
是用于连接数据库的,controller
用于书写接口的,而models
用于创建数据库的一些模式对象函数
二、安装所需的包
在我们demo
的终端输入:
npm i express --save
npm i mongoose --save
第一个用于创建服务器,第二个用于连接包
编写index.js
的文件
// 引入包
const express = require('express')
// 创建实例
const app = express()
// 用于解析
app.use(express.urlencoded({extended:true}))
// 监听端口
app.listen(80, () => {
console.log('打开了')
})
三、连接数据库创建模式对象
在我们的tools
文件夹下创建index.js
,如果怕搞混可以改成其他的名字,连接我们的数据库
// 引入
const mongoose = require('mongoose')
// 连接
mongoose.connect('mongodb://localhost/student') // 这个student是创建的数据库的名字
// 测试
mongoose.connection.once('open', () => {
console.log('连接成功')
})
mongoose.connection.once('close', () => {
console.log('连接断开----')
})
module.exports = mongoose
然后在models.js文件夹下创建index.js文件,用于创建模式对象
const mongoose = require('../tools/index.js')
// 创建Schema(模式)对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
uname: {
type: String,
default: '法外狂徒张三'
},
age: Number,
sex: {
type: String,
default: 'boy'
}
})
const stuModel = mongoose.model('stu', stuSchema)
const creat = (postData) => {
return new stuModel(postData)
.save()
.then((res) => res)
.catch((err) => {
console.log('插入失败' + err)
return false
})
}
const list = (skip, pageSize) => {
return stuModel
.find()
.skip(skip)
.limit(pageSize)
.then((res) => res)
.catch((err) => {
console.log('查询失败' + err)
return []
})
}
module.exports = {
creat,
list
}
四、书写简单的接口
在我们的controller
文件夹下创建index.js
文件,书写以下内容
const { creat, list } = require('../models/index.js')
const addStr = async (req, res) => {
const postData = req.body
console.log(postData)
let rs = await creat(postData)
if (rs) {
res.send({
meta: {
state: 200,
msg: '添加成功'
},
data: null
})
return
}
res.send({
meta: {
state: 500,
msg: '添加失败'
},
data: null
})
return
}
const index = async (req, res) => {
let getData = req.query
let skip = (parseInt(getData.page) - 1) * parseInt(getData.pageSize)
const data = await list(skip, getData.pageSize)
res.send({
mate: {
state: 200,
msg: '查询成功'
},
data
})
}
module.exports = {
addStr,
index
}
五、使用
在入口文件下就可以书写接口了
const express = require('express')
const {addStr,index} = require('./controller/index.js')
const app = express()
app.use(express.urlencoded({extended:true}))
app.get('/', (req, res) => {
res.send('hello')
})
app.post('/stu',addStr)
app.get('/stu',index)
app.listen(80, () => {
console.log('打开了')
})
六、测试
在我们下载安装的目录mongoDb
的文件夹下找到bin
文件夹,进入文件夹,在地址栏输入cmd
打开该文件夹的终端,在终端输入:
mongod --dbpath=..\data\db
来启动我们的数据库,如果配置环境变量可以直接输入mongod
可以使用可视化的软件去连接数据库查看数据库的状态;然后在进入我们的demo
下,输入node index.js
来启动我们的服务器,使用postman
或者Apipost
来对我们写的接口进行一定的测试
七、拓展数据库操作
1、准备基本结构
准备一些基本的结构
// 引入
const mongoose = require('mongoose')
// 连接
mongoose.connect('mongodb://localhost/mongoose_test')
// 测试
mongoose.connection.once('open', () => {
console.log('连接成功')
})
mongoose.connection.once('close', () => {
console.log('连接断开----')
})
// 创建Schema(模式)对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: 'female'
},
address: String
})
const stuModel = mongoose.model('student', stuSchema)
有了Model:我们就可以对数据库进行增删改查的操作了
注意:其中的一些api
已经废弃了,控制台也会警告该api
已经废弃,可以使用其他的来代替,更多的api
可以见官网文档:<Mongoose.js中文网 (mongoosejs.net)>
2、增
- Model.create(doc(s),[callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
- doc(s):可以是一个文档对象,也可以是一个文档对象的数组
- callback:当我们操作完成以后的回调函数
- 第一个参数为错误信息,第二个是插入的文档
举例子:
stuModel.create(
[
{
name: 'tony',
age: 22,
gender: 'male',
address: 'China'
},
{
name: 'Marry',
age: 18,
address: 'UK'
}
],
(err) => {
if (!err) {
console.log('插入成功')
}
}
)
3、查
Model.find(conditions,[projection],[options],[callback])
- 查询所有符合条件的文档,返回的是一个数组
Model.findById(id,[projection],[options],[callback])
- 根据文档的id属性查询文档,返回的是一个对象,id是一个字符串
Model.findOne([conditions],[projection],[options],[callback])
- 查询符合条件的第一个文档,返回一个对象
- 参数:
- conditions:查询条件
- projection:投影
- 传统方式:{ name: 1 }
- 字符串写法:'name -_id' 减号表式去除该选项
- options:查询选项(skip,limit)
- { skip: 1 } 表式跳过第一个
- { limit: 2 } 只显示两个
- callback:回调函数,查询的结果会通过回调函数返回
- 回调函数必传,如果不传,压根不会查询
举例:
stuModel.find({}, (err, docs) => {
if (!err) {
console.log(docs)
}
})
stuModel.find({}, 'name -_id', { limit: 2 }, (err, docs) => {
if (!err) {
console.log(docs)
}
})
4、改
- Model.update(conditions,doc,[options],[callback])
- Model.updateMany(conditions,doc,[options],[callback])
- Model.updateOne(conditions,doc,[options],[callback])
- 用来修改一个或多个文档
- 参数:
- conditions:查询条件
- doc:修改后的对象
- options:配置参数
- callback:回调函数,查询的结果会通过回调函数返回
- 回调函数必传,如果不传,压根不会查询
举例:
stuModel.updateOne({ name: 'tony' }, { $set: { age: 48 } }, (err) => {
if (!err) {
console.log('修改成功')
}
})
5、删
- Model.remove(conditions,[callback])
- Model.delete(conditions,[callback])
- Model.deleteOne(conditions,[callback])
- Model.deleteMany(conditions,[callback])
举例:
stuModel.remove({ name: 'Marry' }, (err) => {
if (!err) {
console.log('删除成功')
}
})
6、查看同一文档数量
- Model.count(conditions,[callback])
举例:
stuModel.count({}, (err, count) => {
if (!err) {
console.log(count)
}
})