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是一个介于 ...
随机推荐
- LeetCode 73,为什么第一反应想到的解法很有可能是个坑?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode第42篇文章,我们来看看LeetCode第73题矩阵置零,set matrix zeroes. 这题的难度是Mediu ...
- 实现一个字符串匹配算法,从字符串 H 中,查找 是否存在字符串 Y ,若是存在返回所在位置的索引,不存在返回 -1(不基于indexOf/includes方法)
/** 1.循环原始字符串的每一项,让每一项从当前位置向后截取 H.length 个字符, 然后和 Y 进行比较,如果不一样,继续循环:如果一样返回当前索引即可 **/ function myInde ...
- Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...
- Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵
螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...
- Java实现 蓝桥杯 算法提高 宰羊
试题 算法提高 宰羊 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃. 炫炫家有N只羊,羊圈排成一排,标号1~N.炫炫每天吃掉一只羊( ...
- Java实现 LeetCode 113 路径总和 II
113. 路径总和 II 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...
- Java实现币值最大化问题
1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,-,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大. 2 解决方案 2.1 动态规 ...
- Java 是如何实现跨平台的?
Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 ...
- https://www.cnblogs.com/mrchige/p/6409444.html
https://www.cnblogs.com/mrchige/p/6409444.html http://c.biancheng.net/view/2172.html https://www.cnb ...
- Python 中的类的继承
class parent(object): def override1(self): print("Parent") class child(parent): def overri ...