【manim】Animations 详解
【manim】初入代码动画的王国
设计一个实际可用的数据库
【mongoose】3.阅读官方文档
1. Models
上一篇笔记讲到了mongoose的基本用法,本次来讲一下oModel
中的一些方法怎么用。
其实,有了Model我们就可以对数据库进行增删改查的操作了。
对于Model的方法,我们可以通过查阅官方的API文档来获得最新和最全面的了解: 官方文档API

这里讲一些看文档需要注意的点。Model.xxx
风格的API表示Model构造函数的方法,可以用于创建对象。
Model#xxx
风格的API表示Model创建的对象调用的方法,也就是文档对象调用的方法,当然我发现官方现在好像是这样写了:Object.prototype.xxx()
。
这里讲几个常用的API,自己去官方文档取经吧: -
Model.find()
- Model.create()
-
Model.findOne()
实际上,关于find
的API就不少,实际使用还需自己根据情况来决定:

2. Document
2.1 添加
Document
是Model
的一个示例,通过Model
查询到的结果都是Document
。
我们其实可以直接创建一个Document
(文档对象)其实就是最开始我说的官方推荐的写法:
1
2
3
4const student = new StuModel({
name: "Sy",
age: 18
})
将这个文档对象打印出来就是: 1
2
3
4
5
6
7{
name: 'Sy',
age: 15,
gender: 'male',
address: 'XJUFE',
_id: new ObjectId('67e3ecde490b511fb8c53cd2')
}
很容易发现,此时文档并没有被插入到数据库,仅仅是放到了内存中。
我们来讲他插入到数据库中(document#save()
):
1
docs.save();
这里讲一下在我的Node.js项目中经常突然乍现的一个Bug:在运行项目后有时会突然报错
1
ReferenceError: require is not defined
查了一下是因为node
更新的原因,现在默认要求用import
语法,如果还是想要用require
就需要:
1
2import { createRequire } from 'module';
const require = createRequire(import.meta.url);
所以在保存文件时有两种方法: 1
2docs.save();
Model.create({});
2.2 修改
修改docs也很简单,第一种方法当然是官方的API
方法。
但其实也可以通过.
分隔符来修改文档的属性:
1
2docs.name = "Syyyo900";
await docs.save();
2.3 get和set
文档提供了一些很快捷的方法来直接得到文档的内容: -
doc.get('age', String)
获取年龄并将数据转为字符串类型,第二个参数可选
文档还提供了set
方法,可以快速修改文档的内容,有多种写法,可以参考API文档。
2.4 其他
文档有一个doc.toJSON()
方法,可以将该文档转为JSON
对象。
用doc.toObject()
可以让文档变成一个普通的Object
对象,但是会让所有文档的方法失效。
所以,只有在特殊情况下才会使用,比如需要删除文档中的敏感数据,想要调用delete docs.address
来隐藏地址,就只能通过该方法来实现。
【mongoose】2.Schema和Model
mongoose
中提供了三种数据库: - Schema - Model -
Document
一般我们把Schema
叫做一个约束对象,里面定义约束的规则,Model
是数据库中对集合的一个映射。
我们来看一看下面的代码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
// Schema仅仅是一个约束配置对象
let stuSchema = new mongoose.Schema({
name: String,
age: Number,
gender: {
type: String,
default: "male"
},
address: String
})
// Model代表数据库中的一个集合
// 参数一:集合名(与数据库中的集合映射)
// 参数二:Schema 约束模式对象
const StudentModel = mongoose.model('student', stuSchema); // 创建完模型集合不会自动被创建
// mongoose会自动将集合名变成复数
// 需要插入文档才会自动创建
// StudentModel.create({}, function(err) => {})
StudentModel.create({
name: "Sy",
age: 15,
address: "XJUFE"
})
mongoose.connection.once("open", function() {
console.log("数据库连接成功");
})
定义了一个约束对象
stuSchema
,用的是mongoose.Schema({})
接口。1
2
3
4
5
6
7
8
9
10// Schema仅仅是一个约束配置对象
let stuSchema = new mongoose.Schema({
name: String,
age: Number,
gender: {
type: String,
default: "male"
},
address: String
})映射到
student
集合,并添加了约束规则。1
const StudentModel = mongoose.model('student', stuSchema); // 创建完模型集合不会自动被创建
这里需要注意,
student
在数据库中会自动被转为复数形式,如果是child
就会被转为children
,非常智能就对了。这个功能甚至有点智能地让人想笑。
- 默认情况数据库中可能还没有这个集合,通过模型来应用约束对象并创建一个文档可以看到这个集合。
1
2
3
4
5
6// StudentModel.create({})
StudentModel.create({
name: "Sy",
age: 15,
address: "XJUFE"
})
这段代码来自2018年的教程,现在来看显然有点老了。因为我查询了官方文档后得知,官方现在推荐并展示的创建文档的写法是面向对象式地
new
一个文档,例如下方这个代码示例:
1 | const student = new Student({ name: 'fluffy' }); |
【mongoose】1.简介
1. 简介
自从用过一次mongoose
,我就再也忘不掉它了。mongoose
是node.js
中基于mongoDB
驱动封装的模块。提供了模型的接口,可以高效地创建集合的数据校验,一定程度上可以避免数据的结构问题。
在mongodb
中有集合的概念,相当于是sql
中的表。在mongoose
中将集合进一步抽象成了一个模型,这个模型可以进行集合的校验,并在集合内添加数据。
2. 连接客户端
在mongoose中可以这样连接数据库: 1
2
3
4
5
6
7
8
9
10
11
12
13const mongoose = require('mongoose')
// 导入mongoose模块
mongoose.connect('mongodb://localhost/test')
// 连接数据库,默认端口可省略
mongoose.connection.once("open", function() {
console.log("数据库连接成功");
})
// 内置接口,在连接时执行回调函数
mongoose.connection.once("close", function() {
console.log("数据库已断开");
})
// mongoose不会自己关闭数据库,除非项目停止或服务器关闭,否则一般不会断开。
mongoose.disconnect(); // 使用本方法可以手动断开数据库连接(一般不用)
【Mongodb】5.使用模型
在之前的学习中,我们使用了Restful API的模式,将数据的操作放到了单独的文件夹中,路由也放在了单独的文件夹。
这次我们尝试使用mongoose
的Model
模型来管理数据库的数据,使用模型的一大好处就是可以约束数据的结构,从而使数据相对来说更加规范和安全。
在node.js
中原生支持了mongodb
模块来操作mongodb
数据库,这次我们使用mongoose
模块,他是mongodb
模块的一个封装,将很多操作化繁为简,并且直接支持模型的操作,非常方便。
1 | const express = require('express') |
这是一个基本的示例程序,我们通过mongoose
API连接了数据库,并用mongoose.model('xxx', new mongoose.Schema({}))
定义了一个数据库的模型对象,通过这个对象能够直接对数据库进行规范的操作。
【Mongodb】4.查询所有文章
还是和之前一样文章的模型文件models/post.js
中添加一个模型方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20const postCollection = require("../config/mongoDbConnection").getCollection("postCollection");
exports.save = async(post) => {
try {
const col = await postCollection();
const result = await col.insertOne(post)
return result.ops && result.ops[0];
} catch (err) {
throw "添加到文章出错"
}
}
exports.findAll = async() => {
try {
const col = await postCollection();
return col.find({}).toArray();
} catch(err) {
throw "查询文章出错"
}
}
在文章的路由文件中添加一个新的路由: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26const postModel = require('../models/post')
const router = require('express').Router();
router.post('/add', async (req, res) => {
try {
const newPost = await postModel.save(req.body);
res.send(newPost)
} catch (err) {
console.error(err);
res.status(500).send();
}
})
router.get('/', async (req, res) => {
try {
const posts = await postModel.findAll();
console.log(posts);
res.json(posts);
} catch(err) {
console.error(error);
res.status(404).send(err)
}
})
module.exports = router;
这样我们就添加了文章的查询逻辑,访问GET:http://localhost:3000/api/post/
即可查询所有文章的记录。
当然,这里的代码都已经是5
年前的了,很多方法其实已经迭代,比如模型的设计在最新的MongoDB
中可以使用Model
来替代,主要是学习一下这里的设计思想最为重要。
【Mongodb】3.创建文章Model和保存文章
一、准备工作
假设你已经有了这样的MongoDB
数据库结构:

其中的文档结构这里给出:
1 | { |
二、创建文章功能
项目结构:

其中routes
书写我们的路由,并将其注册到app.js
。
我们重点来看models/post.js
中的设计:
1 | const postCollection = require("../config/mongoDbConnection").getCollection("postCollection"); |
可以看到,我们在这里定义了一个文章模型的添加方法,这种设计就是MVC
模式,将模型,数据,操作器分离开来。
在routes/post.js
中,我们注册了文章的添加路由:
1 | const postModel = require('../models/post') |
最后在app.js
中注册路由即可,这里还是贴出代码照顾下新手:
1 | const express = require('express') |