1.0 Mongoose介绍
mongoose是Node环境下异步操作数据的对象数据模型,仅限于Node环境下使用,是基于MongoDB的驱动.
1.0.0连接数据库
const mongoose = require("mongoose");
// useNewUrlParser设个属性会在url里识别用户所需要的db,升级之后必须指定
mongoose.connect("mongodb://admin:[email protected]:27017/admin",{useNewUrlParser:true},(err)=>{
if(err){
console.log(err+"数据库连接失败");
}
console.log("数据库连接成功");
});
module.exports = mongoose;
1.0.1 定义Schema
schema 是mongoose 中会用到的一种数据模式,可以理解为表结构的定义;每个schema 会映射到mongodb 中的一个collection,它不具备操作数据库的能力,同时可以在Schema中定义数据校验,默认值,字段名,字段类型,默认修饰符等特性。
const ArticleSchema = mongoose.Schema({
order_id:String,
uid:Number,
publishTime:String,
all_article:Number,
all_num:{
type:Number,
default:1
}
});
//三个参数的含义,model名,schema名,操作的数据集合
const ArticleModel= mongoose.model("Article",ArticleSchema ,"articles");
module.exports = ArticleModel;
-
required
: required validator 该字段必不可少 -
default
: 当不指定字段值的时候默认的值 -
select
: boolean, specifies default projections for queries -
validate
:validator function 添加校验函数 -
get
: 为这个字段定义一个getter函数,usingObject.defineProperty()
. -
set
: 为这个字段定义一个setter函数,usingObject.defineProperty()
. -
alias
: 为这个字段定义个虚拟的别名, mongoose >= 4.10.0 only. virtual
除了以上几个字段属性,接下来还有index,String,Number,Date等字段特有的属性
Schema Type类型
1.0.2 定义model
model 是由schema 生成的模型,可以对数据库的操作
ArticleModel.数据操作符({....},(err,doc)=>{
if(err){
console.log("......失败"+err);
return
}
// console.log(doc);
});
2.0 mongoose的数据库连接
- 安装
npm i mongoose --save
2、引入mongoose 并连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
//在开启验证的情况下需要用如下方式登录连接
mongoose.connect('mongodb://username:password@localhost:27017/DB_NAME');
mongoose的其他数据操作和mongoDB一样,这里不做记录
3.0 Schema字段属性补充
const OrderSchema = mongoose.Schema({
field_name:{
type:Number,
default:1
}
});
在field_name属性中除了上面Schema中说到的还有:
- Index相关
- index:是否设置该字段为索引
- unique:是否是唯一索引
- sparse :稀疏索引(稀疏索引(或者称间隙索引)就是只包含有索引字段的文档的条目,跳过索引键不存在的文档) 博文介绍
- String相关
-
lowercase
:是否返回调用.toLowerCase()的值 -
uppercase
: 是否返回调用.toUpperCase()的值 -
trim
: 是否去空格 -
match
: RegExp, 创建一个 validator 用于数据校验 -
enum
: 枚举的字符串数组,(字段值必须在这个枚举数组中) validator -
minlength
: 最小长度校验 -
maxlength
最大数据长度校验
-
- Number相关
- max字段必须小于改属性值
- min 字段必须大于改属性值
- Date相关
- max:最大日期
- min:最小日期
4.0 自定义数据校验&&修饰符
4.0.0 自定义校验器
自定义校验器和上面提到的match属性非常类似,可以是正则也可以是其他返回boolean值的表达式,validate针对所有数据类型
const AriticleSchema = mongoose.schema({
field_name:{
validate:function(field_name){
//这里可以是对该字段的任意数据校验内容
return field_name.length>5?true,false;
}
}
)
4.0.1 自定义修饰符Setter&Getter
除了mongoose 以上内置的修饰符以外,我们还可以通过set(建议使用) 修饰符在增加数据的时候对数据进行格式化,此时的数据将会被存储到数据库。也可以通过get在实例获取数据的时候对数据进行格式化,此时的数据并不会被存储到数据库
const AriticleSchema = mongoose.schema({
field_name:{
set(field_value){//field_value是field_name对应的值
return "field_name:"+field_value
}
get(field_value){
return "my title is :"+field_value;
}
}
);
//在实例中调用article.title(假如field_name此时为title)
var article = new ArticleSchema({
title:"文章的标题页面"
});
console.log(article.title)//my title is :文章的标题页面
但是通过ArticleModel.find({}....)查找到的title仍然是 “文章标题页面”
5.0 自定义实例&&静态方法
以下是官网提供的几个静态方法
Mongoose models provide several static helper functions for CRUD operations. Each of these functions returns amongoose
Query
object.
ModelName.deleteMany()
ModelName.deleteOne()
ModelName.find()
ModelName.findById()
ModelName.findByIdAndDelete()
ModelName.findByIdAndRemove()
ModelName.findByIdAndUpdate()
ModelName.findOne()
ModelName.findOneAndDelete()
ModelName.findOneAndRemove()
ModelName.findOneAndUpdate()
ModelName.replaceOne()
ModelName.updateMany()
ModelName.updateOne()
// 静态方法
ArticleSchema.statics.findByAid=function(aid,cb){
//这里的this指向ArticleModel
this.find({"_id":aid},function(err,docs){
cb(err,docs)
})
}
// 实例方法
ArticleSchema.methods.showContent= function(){
console.log('这是一个实例方法');
console.log(this.content);//这里的this指向单个ArticleModel实例对象
};
6.0 多表的数据关联
6.0.0 一对一的数据表关联
ArticleModel.aggregate([
{
$lookup:{
from:"articleCagetory",//关联的表
local_field:"cid",COLLECTION_NAME//的关联字段
foregin_field:"categoryId",//articleCagetory的关联字段
as:"category"//articleCagetory关联之后的名称
}
}
],function(err,docs){
...
})
6.0.1 多表之间的关联
多表的关联如果使用aggregate可以在上段代码中通过叠加多个$lookup实现多表的关联,这里不做过多演示
使用populate使用多表关联
1定义Schema,外键指向关联表的model名(即mongoose.model(,,,))的第一个参数
var ArticleSchema = mongoose.Schema({
aid:Number,
cid:{
ref:"articleCategoryModel"//文章分类表Model
},
author_id:{
ref:"authorModel"//作者表model
}
..........
})
2 引入表的model,并进行关联
const ArticleCategoryModel = require("./model/ArticleCategoryModel.js");
const AuthorModel = require("./model/AuthorModel.js"));
const ArticleModel = require("./model/ArticleModel.js"));
ArticleModel
.find({})
.populate("cid")
.populate("author_id")
....//通过populate("外键字段")可以关联多个表
.exec(function(err,docs){
})
7.0 Mongoose字段过滤
不在找到的数据中显示name字段
AuthorModel
.find()
.select('-name')
.exec(function(err, doc){
})
表关联过滤搜索
ArticleModel
.findById(id)
.populate({
path: 'author_id',//在ArticleMode中的某个字段
select: 'name age'//要在AuthorModel中搜索的显示的关键字
}).exec(function (err, result){
...
})
模糊搜索
var kw = ctx.params.keyword
AuthorModel
.find({$or:[{name:kw },{title:kw}]})
.exec(function(err, doc){
})
8.0 数据备份与还原
数据导出
首先数据库备份: mongodump -h IP --port 端口 -u=用户名 -p=密码 -d 数据库 -o 文件存在路径 --authenticationDatabase admin
数据导入
mongorestore -d 127.0.0.1:27017 -d koademo -u=admin -p=123456 C:\Users\hp\Desktop\db\eggcms --authenticationDatabase admin