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)的更多相关文章

  1. MongoDb 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...

  2. MongoDB快速入门教程 (3.2)

    3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...

  3. MongoDB快速入门教程 (4.4)

    4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...

  4. MongoDB快速入门教程 (4.2)

    4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...

  5. MongoDB快速入门教程 (4.1)

    4.Mongoose使用 4.1.nodejs操作mongodb 文档地址:http://mongodb.github.io/node-mongodb-native/3.2/tutorials/cru ...

  6. MongoDB快速入门教程 (3.3)

    3.4.聚合 3.4.1.什么是聚合? MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 例如上图 ...

  7. MongoDB快速入门教程(3.1)

    3.MongoDB进阶 3.1.权限验证 以下内容适用于Mac系统用户,window系统用户请看后面文档 3.1.1.创建超级管理员用户 默认情况下连接mongodb是不需要用户名和密码的,这样不安全 ...

  8. MongoDB快速入门教程 (2)

    2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...

  9. MongoDB快速入门教程 (1)

    1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...

随机推荐

  1. Java实现 LeetCode 816 模糊坐标(暴力)

    816. 模糊坐标 我们有一些二维坐标,如 "(1, 3)" 或 "(2, 0.5)",然后我们移除所有逗号,小数点和空格,得到一个字符串S.返回所有可能的原始 ...

  2. Java实现 LeetCode 815 公交路线(创建关系+BFS)

    815. 公交路线 我们有一系列公交路线.每一条路线 routes[i] 上都有一辆公交车在上面循环行驶.例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车 ...

  3. java代码(13) ---Predicate详解

    Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,在查看这些属性上是否有我们自定义的UUID注解 如果有该注解,那 ...

  4. 你都这么拼了,面试官TM怎么还是无动于衷?

    前言 面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. ...

  5. Flask 安装和简单使用

    安装 pip install flask # 1 导入 Falsk from flask import Flask # 2 生成一个 Flask 对象,__name__表示当前文件的名字 app = ...

  6. Python--循环--for && while

    for循环示例:猜数字游戏 winning_number = 38 for i in range(3): guess_num = int(input("guess num:") ) ...

  7. javascript 面向对象学习(二)——原型与继承

    什么是原型? 首先我们创建一个简单的空对象,再把它打印出来 var example = {} console.log(example) 结果如下: { __proto__: { constructor ...

  8. MyBatis使用模糊查询用户信息及log4j配置文件详解

    1.1 根据用户名称模糊查询用户信息 根据用户名模糊查询用户信息,只需要我们更改映射文件中的sql语句.其他的内容跟上一篇的内容是一样的 1.2添加根据用户名称模糊查询用户信息的sql语句 实例中是查 ...

  9. 宝塔部署时,出现“open_basedir restriction in effect”错误

    下面是错误代码: Warning: require(): open_basedir restriction in effect. Warning: require(XXXXXXXXXXX): fail ...

  10. Water Testing【皮克定理,多边形面积,线段上点的数目】

    Water Testing 传送门:链接  来源:UPC 9656 题目描述 You just bought a large piece of agricultural land, but you n ...