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
}
}
})
注意:如果控制臺出現(xiàn)下面的警告
image
解決方案:
在連接數(shù)據(jù)庫的時候加上配置項
mongoose.connect('mongodb://testadmin:nodeing123@127.0.0.1:27017/test', {
useNewUrlParser: true,
// 使用createIndexes來創(chuàng)建索引
useCreateIndex: true
}, (err) => {
if (err) {
console.log(err)
return
}
console.log('數(shù)據(jù)庫連接成功')
})
#4.5.2.內(nèi)置方法
文檔地址:https://mongoosejs.com/docs/queries.html
這些內(nèi)置的方法我們其實已經(jīng)在前面增刪查改中使用過一些凡辱,這里不再舉例
#4.5.3.擴展靜態(tài)方法
靜態(tài)方法的特點是不需要實例化就可以直接調(diào)用的
1.在Schema上定義方法
let mongoose = require('./db')
// 3.定義Schema,例如:現(xiàn)在需要操作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.創(chuàng)建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
2.調(diào)用方法
let UserModel = require('./model/users')
UserModel.findBySn("1001", (err, result) => {
console.log(result)
})
#4.6.Mongoose數(shù)據(jù)校驗
做數(shù)據(jù)校驗的目的就是保證添加到數(shù)據(jù)庫中的數(shù)據(jù)的合法性
#4.6.1.內(nèi)置校驗參數(shù)
以下是用于數(shù)據(jù)校驗的各種參數(shù)
參數(shù) | 作用 |
---|---|
required | 這個數(shù)據(jù)必須傳奇颠,不可以省 |
max | 用于Number集歇、日期類型组底,表示最大值 |
min | 用于Number、日期類型捕传,表示最小值 |
enum | 枚舉類型,要求數(shù)據(jù)必須滿足枚舉值 |
match | 正則匹配 |
舉個例子:
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
}
}
})
增加數(shù)據(jù):
let UserModel = require('./model/users')
// 增加數(shù)據(jù)
let UserObj = new UserModel({
sn: 1001,
name: 'nodeing',
age: 28,
status: 0,
pic: "www.baidu.com"
})
UserObj.save()
注意:上面增加數(shù)據(jù)的時候扩劝,gender沒有傳庸论,但是定義Schema的時候,又加了required參數(shù)棒呛,那么就會報下面的錯誤
image
從上面的例子我們可以看出聂示,這些校驗參數(shù)的作用實際上就是在規(guī)定數(shù)據(jù)的合法性的,不符合的數(shù)據(jù)不能存入數(shù)據(jù)庫
#4.6.2.自定義驗證器
自定義驗證器是通過配置validate參數(shù)實現(xiàn)的簇秒,請注意看下面代碼中的sn
let mongoose = require('./db')
// 3.定義Schema鱼喉,例如:現(xiàn)在需要操作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.創(chuàng)建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
增加數(shù)據(jù)如下:
let UserModel = require('./model/users')
// 增加數(shù)據(jù)
let UserObj = new UserModel({
sn: "1001",
name: 'nodeing',
age: 28,
status: 0,
gender: '男',
pic: "www.baidu.com"
})
UserObj.save()
注意:由于自定義驗證器需要sn的長度大于5,增加的數(shù)據(jù)中sn只有4位扛禽,因此锋边,會報如下錯誤:
image