MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法
4.5.1.设置索引
let UserSchema = mongoose.Schema({
sn: {
type: Number,
// 设置唯一索引
unique: true
},
name: {
type: String,
// 设置普通索引
index: 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
}
}
})
注意:如果控制台出现下面的警告

解决方案:
在连接数据库的时候加上配置项
mongoose.connect('mongodb://testadmin:nodeing123@127.0.0.1:27017/test', {
useNewUrlParser: true,
// 使用createIndexes来创建索引
useCreateIndex: true
}, (err) => {
if (err) {
console.log(err)
return
}
console.log('数据库连接成功')
})
4.5.2.内置方法
文档地址:https://mongoosejs.com/docs/queries.html
这些内置的方法我们其实已经在前面增删查改中使用过一些,这里不再举例
4.5.3.扩展静态方法
静态方法的特点是不需要实例化就可以直接调用的
1.在Schema上定义方法
let mongoose = require('./db')
// 3.定义Schema,例如:现在需要操作user集合(表),我们就需要给这个集合定义一个对应的Schema
let UserSchema = mongoose.Schema({
sn: {
type: Number,
// 设置唯一索引
unique: true,
index: true
},
name: {
type: String,
// 设置普通索引
index: 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
}
}
})
UserSchema.statics.findBySn = function(sn, cb){
this.find({"sn": sn}, (err, result) => {
cb(err, result)
})
}
// 4.创建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
2.调用方法
let UserModel = require('./model/users')
UserModel.findBySn("1001", (err, result) => {
console.log(result)
})
4.6.Mongoose数据校验
做数据校验的目的就是保证添加到数据库中的数据的合法性
4.6.1.内置校验参数
以下是用于数据校验的各种参数

举个例子:
let UserSchema = mongoose.Schema({
sn: {
type: Number,
max: 1002
},
name: {
type: String,
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
required: true
},
pic: {
type: String,
set (params) {
if (params.indexOf('http://') != 0 || params.indexOf('https://') !=0 ) {
return "http://"+params
}
return params
}
}
})
增加数据:
let UserModel = require('./model/users')
// 增加数据
let UserObj = new UserModel({
sn: 1001,
name: 'nodeing',
age: 28,
status: 0,
pic: "www.baidu.com"
})
UserObj.save()
注意:上面增加数据的时候,gender没有传,但是定义Schema的时候,又加了required参数,那么就会报下面的错误

从上面的例子我们可以看出,这些校验参数的作用实际上就是在规定数据的合法性的,不符合的数据不能存入数据库
4.6.2.自定义验证器
自定义验证器是通过配置validate参数实现的,请注意看下面代码中的sn
let mongoose = require('./db')
// 3.定义Schema,例如:现在需要操作user集合(表),我们就需要给这个集合定义一个对应的Schema
let UserSchema = mongoose.Schema({
sn: {
type: String,
validate: (sn) => {
// 返回true表示验证通过 返回false表示验证失败
return sn.length > 5
}
},
name: {
type: String,
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
required: true
},
pic: {
type: String,
set (params) {
if (params.indexOf('http://') != 0 || params.indexOf('https://') !=0 ) {
return "http://"+params
}
return params
}
}
})
// 4.创建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
增加数据如下:
let UserModel = require('./model/users')
// 增加数据
let UserObj = new UserModel({
sn: "1001",
name: 'nodeing',
age: 28,
status: 0,
gender: '男',
pic: "www.baidu.com"
})
UserObj.save()
注意:由于自定义验证器需要sn的长度大于5,增加的数据中sn只有4位,因此,会报如下错误:

螺钉课堂视频课程地址:http://edu.nodeing.com
MongoDB快速入门教程 (4.4)的更多相关文章
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- MongoDB快速入门教程 (3.2)
3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...
- MongoDB快速入门教程 (4.3)
4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...
- 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实现蓝桥杯VIP算法训练 纪念品分组
试题 算法训练 纪念品分组 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡, ...
- java中PipedStream管道流通信详细使用(详解)
多线程使用PipedStream 通讯 Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是 类名 作用 备注 PipedInputStream 字节管道输入流 字节流 Pi ...
- Java实现交替字符串
1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 此处采用动态规划法,可以较大的提高时间 ...
- Java实现第九届蓝桥杯字母阵列
字母阵列 题目描述 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN ...
- Java实现第十届蓝桥杯迷宫
试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷 ...
- 还在用SimpleDateFormat格式化时间?小心经理锤你
还在用SimpleDateFormat格式化时间?小心经理锤你 场景 本来开开心心的周末时光,线上突然就疯狂报错,以为程序炸了,截停日志,发现是就是类似下述一段错误 java.lang.NumberF ...
- iOS-NSString常见方法
</pre><pre name="code" class="html">#import <Foundation/Foundatio ...
- struts 通配符的使用
使用通配符可以将配置量降到最低,十分方便 新建一个javaweb项目 在项目中加入Struts.xml( 选中项目右键MyEclipse-->project facets-->Struts ...
- 05-IntentFilter的匹配规则
IntentFilter的匹配规则 原则上一个Intent不应该既是显示调用又是隐式调用,如果二者共存的话以显式调用为主 隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过 ...
- yii2中的场景使用
下面给大家介绍一下 yii2.0 场景的使用.小伙多唠叨一下了,就是担心有的人还不知道,举个简单的例子,现在在 post表里面有 title image content 三个的字段,当我创建一个 po ...