Mongoose基础
一、Mongoose是什么?
是node中提供操作MongoDB的模块。
二、Mongoose的作用
能够通过node语法实现MongoDB数据库的增删改查,从而实现node写程序来管理MongoDB数据库。
三、操作步骤
3.1 引入mongoose模块并建立连接
在建立连接时:useNewUrlParser属性会在url中识别并验证用户用户所需要的数据库,mongodb 4.0版本以前不需要指定,4.0以后的版本一定要指定。
// 引入mongoose
const mongoose = require('mongoose');
// 建立连接
mongoose.connect('mongodb://IP:端口号/test', {useNewUrlParser: true}, () => {
// 回调函数可以检测连接是否成功
});
3.2 Schema
作用:用来约束MongoDB文档数据(哪些字段是必须的,哪些字段是可选的)。
// 操作users表(集合) 定义一个Schema Schema里面的对象和数据库表里边的字段需要一一对应
// 两种写法,按需选择
var UserSchema = mongoose.Schema({
name: {
type: String,
// 指定默认值
default: 'w'
},
age: Number,
status: Number
})
var UserSchema = mongoose.Schema({
name:String,
age: Number,
status: Number
})
3.3 model定义数据库模型
第一个参数:
1、首字母要大写。2、要和数据库集合名称对应(默认这个模型会和模型名称相同的复数的数据库集合建立连接)
第二个参数:
定义的Schema名
第三个参数:
映射集合,将user集合映射给User(等同于重命名)
var User = mongoose.model('User', UserSchema, 'user')
var User = mongoose.model('User', UserSchema)
一个模型对应一个集合,通过模型来管理集合中的数据。
3.4 模式修饰符
可以对增加的数据进行一些格式化
mongoose预定义模式修饰符
trim | 去掉首尾空格 |
---|---|
lowercase | 小写字母 |
uppercase | 大写字母 |
var UserSchema = mongoose.Schema({
name: {
type:String,
trim:true//去掉name首尾空格
},
age: Number,
status: Number
})
自定义预定义修饰符
我们可以通过set(建议使用)修饰符在增加数据的时候对数据进行格式化,也可以通过get(不建议使用)在
实例获取数据
(也就是在获取model里的数据)的时候对数据进行格式化。
使用set
var UserSchema = mongoose.Schema({
name: {
type:String,
set(parmas){//增加数据的时候对数据进行处理,若name不是以 w 开头就为其头加上 w
if(!parmas){
return '';
}else{
if(parmas.indexOf('w') != 0){
return 'w' + parmas;
}
}
}
}
age: Number,
status: Number
})
使用get
var UserSchema = mongoose.Schema({
name: {
type:String,
get(parmas){//增加数据的时候对数据进行处理,若name不是以 w 开头就为其头加上 w
if(!parmas){
return '';
}else{
if(parmas.indexOf('w') != 0){
return 'w' + parmas;
}
}
}
}
age: Number,
status: Number
})
//若果用get进行格式化,那么在实例化的时候数据就格式化了(就是进行下面的操作的时候),
//执行完后name就变成了‘wli’
var u = new User({
name: 'li',
age: 20,
status: 1
})
3.5 mongoose索引
给数据增加索引的目的是优化查询,但是不建议给无关数据添加索引,因为索引会减慢增加数据的速度。
var UserSchema = mongoose.Schema({
name: {
type:String,
unique:true//唯一索引
},
age: {
type:String,
index:true//普通 索引
},
status: Number
})
3.6 数据校验
require | 表示这个数据不能为空 |
---|---|
max | 用于Number类型数据,最大值 |
min | 用于Number类型数据,最小值 |
enum | 枚举类型,要求数据必须瞒住枚举值 (用在string类型) enum:[‘0’,‘1’] |
match | 增加的数据必须符合match(正则,用在string)的规则 |
maxlength | 最大值(用在string类型) |
minlength | 最小值(用在string类型) |
var UserSchema = mongoose.Schema({
name: {
type:String,
require:true//实例化的时候必需要有数据
},
age: String,
status: Number
})
自定义数据校验
var UserSchema = mongoose.Schema({
name: {
type:String,
//自定义name长度要大于10
validate:(ob) => {
return ob.length >= 10;
}
},
age: String,
status: Number
})
3.7 增删改查
//增加数据首先要定义一个数据实例
var u = new User({
name: 'li',
age: 20,
status: 1
})
//增加
u.save((err, doc) => {
// 回调函数
})
//查询
User.find({/*查询条件 */}, (err, doc) => {
// 回调函数
})
// 数据更新一条数据
User.updateOne({ "name": "li"/*条件*/ }, { "age": 24/*要修改的新值 */ }, (err, doc) => {
// 回调函数
})
//删除一条数据
User.deleteOne({ "name": "li"/*条件*/ }, (err, doc) => {
// 回调函数
})
3.8 自定义方法
自定义静态方法
UserSchema.static.findByName = (name, cb){
this.find('name':name, (err, docs){
//cb是回调函数
cb(err, docs);
})
}
自定义实例方法(基本不用)
实例方法只能在实例化model以后才能使用
UserSchema.methods.print = () => {
cosole.log('实例方法');
}
3.9 mongoose聚合管道
使用聚合管道可以对集合中的文档进行变换和组合。 实际项目:表关联查询、数据的统计。
两表关联查询举例:
orderModel.aggregate([
{
$lookup: {
from: "order_item",//关联的表
localField: "order_id",//关联的条件
foreignField: "order_id",//关联的条件
as: "items"//查询到的数据放到items里边
}
}
], (err, docs) => {
// 回调函数
})
多表关联查询举例
orderModel.aggregate([
{
$lookup: {
from: "order_item",//关联的表
localField: "order_id",//关联的条件
foreignField: "order_id",//关联的条件
as: "items"//查询到的数据放到items里边
},
$lookup: {
from: "auth_item",//关联的表
localField: "auth_id",//关联的条件
foreignField: "order_id",//关联的条件
as: "auth"//查询到的数据放到auth里边
}
}
], (err, docs) => {
// 回调函数
})
3.10 数据库的导出和导入
导出
mongodump -h dbhost -d dbname -o dbdirectory
-h:ip地址
-d:导出的数据库名
-o:到处的位置(路径)
导入
mongorestore -h dbhost -d dbname <path>
四、接口
4.1 接口是什么?
接口就是一个文件(js/jsp/php等),主要响应JSON数据(操作方便,体积小)或XML数据。
//推荐JSON数据格式
{
meta: {
msg: 提示信息,
status: 状态码(200/201/301/302/400/401/403/404/500)
},
data: 数据
}
4.2 作用
数据角度:让我们的项目静态/固定数据动态(也就是让数据来源于数据库)。
功能角度:短信提示、天气接口等。
关于Mongoos的其它操作可以查看官方文档
点这里
,兄弟们,加油啊!!!