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是一个介于 ...
随机推荐
- Java实现 LeetCode 816 模糊坐标(暴力)
816. 模糊坐标 我们有一些二维坐标,如 "(1, 3)" 或 "(2, 0.5)",然后我们移除所有逗号,小数点和空格,得到一个字符串S.返回所有可能的原始 ...
- Java实现 LeetCode 815 公交路线(创建关系+BFS)
815. 公交路线 我们有一系列公交路线.每一条路线 routes[i] 上都有一辆公交车在上面循环行驶.例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车 ...
- java代码(13) ---Predicate详解
Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,在查看这些属性上是否有我们自定义的UUID注解 如果有该注解,那 ...
- 你都这么拼了,面试官TM怎么还是无动于衷?
前言 面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. ...
- Flask 安装和简单使用
安装 pip install flask # 1 导入 Falsk from flask import Flask # 2 生成一个 Flask 对象,__name__表示当前文件的名字 app = ...
- Python--循环--for && while
for循环示例:猜数字游戏 winning_number = 38 for i in range(3): guess_num = int(input("guess num:") ) ...
- javascript 面向对象学习(二)——原型与继承
什么是原型? 首先我们创建一个简单的空对象,再把它打印出来 var example = {} console.log(example) 结果如下: { __proto__: { constructor ...
- MyBatis使用模糊查询用户信息及log4j配置文件详解
1.1 根据用户名称模糊查询用户信息 根据用户名模糊查询用户信息,只需要我们更改映射文件中的sql语句.其他的内容跟上一篇的内容是一样的 1.2添加根据用户名称模糊查询用户信息的sql语句 实例中是查 ...
- 宝塔部署时,出现“open_basedir restriction in effect”错误
下面是错误代码: Warning: require(): open_basedir restriction in effect. Warning: require(XXXXXXXXXXX): fail ...
- Water Testing【皮克定理,多边形面积,线段上点的数目】
Water Testing 传送门:链接 来源:UPC 9656 题目描述 You just bought a large piece of agricultural land, but you n ...