mongoose模块

一、简介

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

这种方式暂时不多做介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值