MongoDB快速入门教程 (4.3)
4.3.Mongoose模块化
4.3.1.为什么要进行模块化拆分?
模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程、订单、分类、教师等多个集合,我们将每个集合的代码拆分到不同的模块,这样项目结构会清晰很多,同时,这些模块都要连接数据库,每个模块都去连接一遍数据库显然是不合理的写法,正确的做法是把连接数据库的代码单独拆分出来,供各个模块连接数据库的时候使用
4.3.2.拆分步骤
1.把数据库连接代码拆分出去
在项目目录下新建model目录,在model目录下新建db.js文件,这个文件用于存放数据库连接代码
model/db.js代码
// 1.引入mongoose
const mongoose = require('mongoose')
// 2.连接数据库
mongoose.connect('mongodb://testadmin:nodeing123@127.0.0.1:27017/test', {useNewUrlParser: true}, (err) => {
if (err) {
console.log(err)
return
}
console.log('数据库连接成功')
})
module.exports = mongoose
2.把Schema的定义和模型的创建拆分出去
model/users.js中的代码
let mongoose = require('./db')
// 3.定义Schema,例如:现在需要操作user集合(表),我们就需要给这个集合定义一个对应的Schema
let UserSchema = mongoose.Schema({
name: String,
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
// 4.创建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
3.在需要的地方使用上面拆除去的模块
新建一个app.js来测试是否可用
let UserModel = require('./model/users')
// 增加数据
let UserObj = new UserModel({
name: '张三',
age: 20,
status: 0
})
UserObj.save()
项目结构图:

4.4.Mongoose预处理保存的数据
在定义Schema的时候,可以带上一些预定义的处理器,可以帮助我们处理需要保存到数据库的数据
4.4.1.lowercase
定义Schema的时候带上lowercase,可以把需要保存的数据转成小写
let UserSchema = mongoose.Schema({
name: {
type: String,
lowercase: true
},
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
下面例子中name字段的值为全大写:
// 增加数据
let UserObj = new UserModel({
name: 'NONDEING',
age: 28,
status: 0
})
UserObj.save()
因为使用了lowercase,所以保存到数据库中的数据是经过处理了的:

4.4.2.uppercase
uppercase是将字段值转成大写,这个和lowercase类似
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
保存数据的时候,name值全为小写:
// 增加数据
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0
})
UserObj.save()
保存到数据库后,被转成了大写:

4.4.3.trim
trim的作用是去除两边的空格
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
default: '男'
}
})
保存的数据如下:
// 增加数据
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0,
gender: " 女 "
})
保存到数据库后的结果如下:

更多预处理器可以查看文档:https://cn.mongoosedoc.top/docs/schematypes.html
4.4.4.自定义处理器
如果mongoose提供的预处理器没办法满足你的需求,你也可以自定义预处理器,举个例子:保存url的时候,我们规定必须保存http协议,这个时候就需要自定义一个预处理器去满足需求
需求详解:
当保存这样的数据: www.baidu.com 我们希望处理后的结果为:http://www.baidu.com
定义Schema的时候,代码如下:
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
default: '男'
},
pic: {
type: String,
set (params) {
if (params.indexOf('http://') != 0 || params.indexOf('https://') !=0 ) {
return "http://"+params
}
return params
}
}
})
保存的数据如下:
// 增加数据
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0,
gender: " 女 ",
pic: "www.baidu.com"
})
处理后的数据如下:

螺钉课堂视频课程地址:http://edu.nodeing.com
MongoDB快速入门教程 (4.3)的更多相关文章
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- MongoDB快速入门教程 (3.2)
3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...
- MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...
- MongoDB快速入门教程 (4.2)
4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...
- MongoDB快速入门教程 (4.1)
4.Mongoose使用 4.1.nodejs操作mongodb 文档地址:http://mongodb.github.io/node-mongodb-native/3.2/tutorials/cru ...
- MongoDB快速入门教程 (3.3)
3.4.聚合 3.4.1.什么是聚合? MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 例如上图 ...
- MongoDB快速入门教程(3.1)
3.MongoDB进阶 3.1.权限验证 以下内容适用于Mac系统用户,window系统用户请看后面文档 3.1.1.创建超级管理员用户 默认情况下连接mongodb是不需要用户名和密码的,这样不安全 ...
- MongoDB快速入门教程 (2)
2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...
- MongoDB快速入门教程 (1)
1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...
随机推荐
- 跨域解决方案 - webpack devServer
1. 定义 如果一个项目中配置了webpack, 那么我们使用 webpack devServer 来配置代理转发请求来达到解决跨域问题的目的 webpack devServer 能够解决跨域问题的根 ...
- JAVASE(十八) 反射: Class的获取、ClassLoader、反射的应用、动态代理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.反射(JAVA Reflection)的理解 1.1 什么是反射(JAVA Reflection) ...
- Java实现 LeetCode 321 拼接最大数
321. 拼接最大数 给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要 ...
- Java实现 蓝桥杯VIP 算法提高 密码锁
算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...
- Java实现埃拉托色尼筛选法
1 问题描述 Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes. 翻译:使用埃拉托色尼筛选 ...
- (一)SQL注入漏洞测试的方式总结
一.工具注入 1.SQLMap的作用 判断可注入的参数 判断可以用那种SQL注入技术来注入 识别出哪种数据库 根据用户选择,读取哪些数据(库.表.列.字段值...) 2.注入技术 [A]基于布尔的盲注 ...
- 运行npm run start 提示primordials is not defined
下载https://github.com/ant-motion/editor-list 执行 npm install npm start gulp构建时报错. 原因:安装gulp版本与node版本不兼 ...
- chattr +i 用户也没法随意删除
root用户也没法用rm随意删除文件? 前言 在你的印象中,是不是root用户就可以为所欲为呢?随便一个rm -rf *,一波骚操作走人?可能没那么容易. 先来个示例,创建一个文本文件test.t ...
- TD课程通的最终版评价
相较之前的软件,功能得到了完善,同时也修复了BUG,还增加了辅助工具,可以查询一周的占用情况,省空间,很方便. 添加课程表的功能也得到了完善,同时增加了链接到教务系统的功能,方便查询相关的课程.问题是 ...
- SpringMVC+Mybatis初尝试
一个月前简单学完了SpringMVC框架和Mybatis框架,一直没有使用过,今天主要用它做了个简单的学生管理系统,不过第一次用框架,实现的功能简单,比较low. 注:这里使用的数据库是SQLServ ...