Node.js如何使用mongoose操作数据库

1,534 阅读4分钟

前言

大家好,我是其润丿。最近在使用koa2+mongoose进行毕设制作,在最开始学习mongoose的过程中遇到了一些问题。特此写下这篇文章对mongoose的使用过程进行记录,希望能对刚学习mongoose的伙伴们提供一些学习上的帮助。

Node.js使用mongoose

下载mongoose

npm install mongoose

引入mongoose

const mongoose = require('mongoose')

连接mongodb数据库

//连接数据库
//mongoose.connect('mongodb://数据库ip:端口号/数据库名',{useMongoClient: true})
//  - 端口默认27017可省略
mongoose
  .connect('mongodb://127.0.0.1/Koa-Vue-GraduationDesign', { useNewUrlParser: true })
  .then(() => {
    console.log('MongoDB connected...')
  })
  .catch((err) => {
    console.log(err)
  })
  1. mongoose.connect('mongodb://数据库ip:端口号/数据库名',{useMongoClient: true})
  2. 本地数据库的ip一般都是127.0.0.1
  3. 数据库名的话是自己进行命名,没有的话在连接成功的时候数据库会自动进行创建
  4. 端口默认27017可省略

mongoose进行数据集合创建

定义数据模式Schema

我们可以在Schema中定义我们创建的该集合中的属性名,属性对应的类型,属性是否必填以及属性是否有初始值等信息。
Schema是mongoose里用到的一种数据模式,可以理解为表结构的定义
Schema里面的对象和数据库表里面的字段一一对应

使用实例

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const UserSchema = new Schema({
    // 用户名
    username:{
        type:String,
        required:true
    },
    // 密码
    password:{
        type:String,
        required:true
    },
    // 用户本人姓名
    fullname:{
        type:String,
        required:true
    },
    // 年龄
    age:{
        type:Number,
        default:''
    },
    // 地址
    address:{
        type:Array,
        default:[]
    },
    // 手机号
    phone:{
        type:String,
        required:true
    },
    // 用户留言
    message:{
        type:String,
        default:""
    },
    // 性别
    sex:{
        type:String,
        default:"woman"
    },
    // 购物车清单
    shoppingCart:{
        type:Array,
        default:[]
    },
    // 已购买商品清单
    purchasedGoods:{
        type:Array,
        default:[]
    },
    // 注册时间
    registrationTime:{
        type: Date,
        required: true,
        default: Date.now
    }
})

module.exports = Users = mongoose.model('users',UserSchema)

定义数据模型Model

可以看到在上方的使用实例中,最后一行使用了mongoose.model

module.exports = Users = mongoose.model('users',UserSchema)

通过mongoose.model就可以对我们的数据库集合进行创建

  • 参数1:对应数据库中集合的名称
  1. 首字母一般情况下大写(这里我忽视了这个情况,大家一定要首字母大写
  2. 默认会操作数据库中参数值复数形式的collection集合
  • 参数2:集合对应我们创建的Schema的名称
  • 参数3:表示实际操作的collection,不采用参数1的默认操作对象,可不传(我没有传)

注意点: 这里我直接通过module.exports对Users进行了导出,目的是为了在后续api的创建时可以对该集合进行引入。

在接口中使用定义好的数据集合

上方展示的使用实例进行继续延伸

对数据模块进行引入

该数据模块就是我们上方通过module.exports导出的Users数据模块

// 引入Users数据库模块
const Users = require('../../models/Users')

具体使用

/**
 * @route POST api/users/delete
 * @description 删除用户信息接口
 * @access      接口公开
 */
usersRouter.post('/delete',async (ctx) =>{
    const _id = ctx.request.body.id
    // 操作数据库,用户信息
    const data = await Users.findOne({ 
        _id
    })
    if(!data){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'该用户不存在!',
            success:false
        }
    }else{
        await Users.remove({_id})
        ctx.status = 200
        ctx.body = {
            status:ctx.status,
            msg:'用户删除成功!',
            success:true,
        }
    }
})
  1. 在接口中实际上就是根据mongoose自带的api,对我们调用的数据集合进行指定的一些操作
  2. Users.findOne() 根据传进去的参数进行条件查找,返回满足条件的第一条数据,这里的话是对传过来的用户id进行条件查找。
  3. Users.remove() 根据传进去的参数进行条件查找,删除满足条件的第一条数据。同理这里根据传过来的用户id进行条件查找,从而进行删除。
  4. 最后在进行一系列操作后,通过ctx.body向前端返回对应的数据以及提示

注意: 在使用mongoose自带的api时,一定要在前方写上await,对应的在函数形参前写上async。这样才是真实的数据

// 操作数据库,用户信息 
const data = await Users.findOne({ _id })

结尾

mongodb数据库对我们前端来说是一个很友好的数据库,相对于mysql来说。用mongoose来操作mongodb数据库能减少很多我们学习的成本,并且写法也与前端中的函数写法十分相似。这也是我在做毕设时使用mongoose的原因。
在学习过程中或多或少的也出现了一些问题,想到了大家可能也会有和我一样的问题,于是写下了这篇文章来供大家学习。希望能帮助到大家的学习,如果文章中出现了一些错误也欢迎大家指出,不足之处也大家请多多包涵与谅解。
a831425b2afcf75bea7ea48db452e334.jpeg