一、简介
mongoose是一个让我们通过node来操作mongodb数据库的一个模块。
二、安装及使用
1.安装
npm i mongoose --save
2.引入并连接数据库
const mongoose = require("mongoose")
// 这里是连接数据库,如果没有数据库那么就会创建该数据库
mongoose.connect("mongodb://127.0.0.1:27017/zhiyao")
3.定义Schema并生成model
数据库中的Schema,为数据库对象的集合。每个Schema对应数据库的一个collection,通过Schema定义collection的结构。
model是由schema生成的模型,可以对数据库操作。
const mongoose = require("mongoose")
const Schema = mongoose.Schema
// 这个是用于限制修改数据库的字段的
const UserType = {
username:String,
password:String,
}
// 通过UserModel可以对数据库进行操作了,user是操作的collection的名称
const UserModel = mongoose.model("user",new Schema(UserType))
module.exports = UserModel
4.增删改查操作
要么通过async和await拿到数据库操作的结果,要么通过回调函数。两者不要同时使用。
// 方式一:async和await
async function(req,res){
let result = await UserModel.create({username,password})
//result 新增的结果
}
//方式二:回调函数
function(req,res){
UserModel.create({username,password},function(err,doc){
console.log('doc:',doc)//新增的结果
})
}
(1)增
// 方式一:create 可以以对象的形式插入一条,也可以以数组的形式插入多条数据
//Model.create(doc(s), [callback])
// 参数:
// [doc(s)]:文档对象或文档对象数组
// [callback]:回调函数
UserModel.create({username,password})
// 方式二:insertMany 可以以对象的形式插入一条,也可以以数组的形式插入多条数据
// Model.insertMany(doc(s), [options], [callback]) 返回值为一个数组
UserModel.insertMany([{username,password},{username:"小芳",password:94}],(err,docs) => {
if(!err){
console.log(docs)
/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
}
})
// 方式三:save 一次只能插入一条数据
// 通过new 一个Model创建一个 document,save方法将数据存入数据库
new UserModel({username,password}).save((err,doc) => {
if(!err){
console.log(doc) //{ _id: 6017bd1cf4cc8544d8ed2a8a, name: '小明', grades: 68, __v: 0 }
}
})
(2)删
删改查,参考下面这篇博客,我后续有时间再完善。
Mongoose (快速入门)_node.js_程程.-DevPress官方社区
5.定义Schema时的修饰符和数据校验方法validate
系统预定义的修饰符
var Schema =new Schema({
name:{ type:String, match:/01/ },
// 将name的match设置为必须存在'01'字符。如果name不存在'01',文档将不被保存,且出现错误提示
// match只能对String类型设置
sex:{type:String,enum:['zs','ls','ww']},
//将sex的枚举取值设置为['zs','ls','ww'],如果sex不在枚举范围内取值,文档将不被保存,且出现错误提示
// enum也只能对String类型设置
hobby:{type:String,validate:nameLength},
//validate实际上是一个函数,函数的参数代表当前字段,返回true表示通过验证,返回false表示未通过验证
age:{
type:Number,
// required和default互斥
required:true // 数据必填
default:18 // 默认值,
min:10, // 最小值
max:18 // 最大值
trim: true // 去前后空格
}
})
function nameLength(arg){
if(arg.length>4){
return true
}
return false
}
自定义修饰符
set修饰符,增加数据的时候对age字段进行处理
var Schema =new Schema({
name:String,
age:{
type:Number,
set(params){
// 当age小于18时改为18,否则不变
if( params < 18){
return 18
}
return params
}
}
})
get修饰符,获取数据的时候对数据进行处理(get基本没啥用)
const mongoose = require("mongoose")
const Schema = mongoose.Schema
// 这个是用于限制修改数据库的字段的
const UserType = {
username:String,
password:{
type:Number,
get(params){
if(params < 18){
return 18
}else{
return params
}
}
},
}
// 通过Schema生成Model,Model创造Document
const UserModel = mongoose.model("user",new Schema(UserType))
module.exports = UserModel
然后
var usermodel = new UserModel({username:'张三',password:2})
usermodel.name // 输出的是18
6.扩展静态方法和实例方法
除了内置的增删改查方法以外,还可以自定义方法。
const mongoose = require("mongoose")
const Schema = mongoose.Schema
// 这个是用于限制修改数据库的字段的
const UserType = {
username:String,
password:Number,
}
var schema = new Schema(UserType)
// 扩展静态方法
schema.static.findByUsername = function(username,callback){
// this就是返回的UserModel
this.find({username:username},function(err,docs){
callback(err,docs)
})
}
// 扩展实例方法(基本没啥用)
schema.methods.printInfo = function(){
// this就是实例化以后的schema,可以拿到实例化以后UserType的数据
console.log(this)
}
const UserModel = mongoose.model("user",schema)
module.exports = UserModel
7.聚合管道
mongoose实现多表联查的方式有两种,一个是使用aggregate,一个是使用populate。
我建议使用aggregate,这个比较方便。
3.2版本之前使用的是populate来实现多表联查,因此,如果要兼容老版本的mongoDB数据库,可以使用populate。
下面的演示都采用这三张表结构进行
(1)aggregate
实现两个表之间的关联
// 将article表与articlecate表进行关联查询
ArticleModel.aggregate([
{
$lookup:{
from:'articlecate', // articlecate的表名
localField: 'cid', // articlecate表的cid
foreignField: '_id', // article表的_id
as:'items' // 关联之后会将article表的内容作为items字段,插入articlecate表中
}
},
{
$match:{ 'all_price':{$gte:90} } //在上面关联的基础上,查找all_price大于90的
}
],function(err,docs){
if(err){
console.log(err)
}
console.log(docs)
})
实现多个表之间的关联
// 将article表与articlecate表进行关联查询
ArticleModel.aggregate([
{
$lookup:{
from:'articlecate', // articlecate表的表名
localField: 'cid', // articlecate表的cid
foreignField: '_id', // article表的_id
as:'items' // 关联之后会将articlecate表的内容作为items字段,插入article表的内容中
}
},
{
$lookup:{
from:'user', // user表的表名
localField: '_id', // user表的cid
foreignField: 'author_id', // article表的author_id
as:'user' // 关联之后会将user表的内容作为user字段,插入article表的内容中
}
},
{
$match:{ 'all_price':{$gte:90} } //在上面关联的基础上,查找all_price大于90的
}
],function(err,docs){
if(err){
console.log(err)
}
console.log(docs)
})
(2)populate
这种方式暂时不多做介绍