Update avaliable. Click RELOAD to update.
目录

Node 中 mongoose 使用

本文介绍 mongoose 库的简单使用,mongoose 主要用于在 Node 环境下对 mongodb 的操作。

1. 初始化工程并安装 mongoose 库

npm init
npm i mongoose

主要目录结构:

database/
|- modules/
    |- Employee.js				
    |- EmployeeAction.js
|- mongodb.js

2. 编写连接 mongodb 代码

需要 mongodb 的连接字符串,可以使用 dotenv 存储,这里为了简单直接写在代码中,mongodb 可以免费使用 cloud mongodb 云上。

[mongodb.js]

import mongoose from "mongoose";

const COLLECTION = 'TT_D';
const MONGODB_URL = `mongodb+srv://wangjunneil:[email protected]/${COLLECTION}?retryWrites=true&w=majority`;

function connectMongo() {
    // 若已经链接
    if (mongoose.connections[0].readyState) {
        console.log('MongoDB is already connected');
        return
    }

    mongoose.connect(MONGODB_URL)
    .then(() => {
        console.log('MongoDB connected')
    })
    .catch(error => {
        console.log(error)
    });
}

export default connectMongo;

3. 定义模型 Schema

每个模型都需要定义,这里以 employee 模型为例,主要定义模型属性及约束。使用 mongoose 的 schema 定义完成模型后,默认自带各种操作方法。

[Employee.js]

import { Schema, model, models } from 'mongoose';

// 定义模型 Schema
const employeeSchema = new Schema({
    empId: {
        type: Number,
        required: true,
        unique: true        // 唯一索引
    },
    name : {
        type: String,
        required: true,
        minlength: 2,       // 最小长度
        maxlength: 4,       // 最大长度
        index: true         // 普通索引
    },
    sex: {
        type: String,
        required: true,
        default: 'male',    // 默认值
        enum: ['male', 'female', 'middle'] // 枚举范围        
    },
    age: {
        type: Number,
        required: true,
        min: 10,            // 最小值
        max: 99             // 最大值
    },
    phone: {
        type: Number,
        required: true,
        match: /^\d{11}$/   // 正则验证
    },
    image: {
        type: String,
        set(url) {          // 可用 set 方法处理值
            return `https://fla.cdn.bosyun.com/other/${url}`
        }
    }
}, { timestamps: true })

const Employee = models.employee || model('employee', employeeSchema);
export default Employee

4. 编写模型操作函数

[EmployeeAction.js]

import connectMongo from '@/database/mongodb';
import Employee from './Employee';

// 连接
connectMongo();

export async function createEmployee(data) {
    try {
        const newEmployee = Employee(data);

        await newEmployee.save();

        return { ...newEmployee._doc, _id: newEmployee._id.toString() };
    } catch (error) {
        throw new Error(error.message || 'Failed to create employee')
    }
}

export async function queryEmployeeAll() {
    try {
        const employees = await Employee.find();

        // id 转字符串
        const newData = employees.map(post => (
            {
                ...post._doc,
                _id: post._doc._id.toString()
            }
        ));

        return newData;
    } catch (error) {
        throw new Error(error.message || 'Failed to query employee')
    }
}

export async function deleteEmployee(condition) {
    try {
        await Employee.deleteOne(condition);
    } catch (error) {
        throw new Error(error.message || 'Failed to delete employee')
    }
}

export async function updateEmployee(condition, data) {
    try {
        await Employee.updateOne(condition, data);
    } catch (error) {
        throw new Error(error.message || 'Failed to update employee')
    }
}

5. 调用模型操作函数

const data = {
  empId: 101,
  name: '里斯',
  age: 29,        
  phone: 16712068888,
  image: 'vod-poster-2.jpg'
}
// 新增
await createEmployee(data);    

// 修改
await updateEmployee({empId:101}, {name:'王武'})

// 删除
await deleteEmployee({empId: 100});

// 查询
const employees = await queryEmployeeAll();
console.log(employees);

基于 mongodb,这里只是用到最基本的 C.R.U.D,还提供很多聚合函数,业务实际场景具体使用。

Reference

版权所有,本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。转载请注明出处:https://www.wangjun.dev//2023/07/how-to-use-mongoose/