Egg 中的 model

  • app/model/** 用于放置领域模型,可选,由领域类相关插件约定。
  • Loader : Egg 在 Koa 的基础上进行增强最重要的就是基于一定的约定
  • 根据功能差异将代码放到不同的目录下管理,对整体团队的开发成本提升有着明显的效果,Loader 实现了这套约定,并抽象了很多底层API可以进一步扩展
  • Loader还提供了caseStyle强制指定首字母大小写,比如加载 model时API首字母大写,app/model/user.js => app.model.User
  • 文档:https://eggjs.org/zh-cn/advanced/loader.html

Egg 中使用 Mongoose

  • 安装:$ npm i egg-mongoose --save

  • 在 {app_root}/config/plugin.js 中启用 egg-mongoose 插件

    exports.mongoose = {enable: true,package: 'egg-mongoose'
    };
    
  • 在配置文件中配置 mongoose 数据库连接地址 {app_root}/config/config.default.js

    //第一种配置方式
    exports.mongoose = {url: 'mongodb://127.0.0.1/example',options: {}
    };
    //第二种推荐配置方式
    exports.mongoose = {client: {url: 'mongodb://127.0.0.1/example', options: {}, },
    };
    
  • 实际的配置举例

    config.mongoose = {// url 示例:mongodb://账号:密码@服务器:端口/库名client: {url: 'mongodb://eggadmin:123456@127.0.0.1:27017/eggcms',options: {},},
    };
    
  • 在egg项目的app目录里面新建model文件夹,在model文件夹中定义mongoose的schema和model。如:{app_root}/app/model/user.js

    module.exports = app => {// 引入建立连接的mongooseconst mongoose = app.mongoose;const Schema = mongoose.Schema;// 数据库表的映射const UserSchema = new Schema({username: {type: String,unique: true,},password: String,age: Number,sex: String,tel: Number,status: {type: Number,default: 1,},});return mongoose.model('User', UserSchema, 'user');
    };
    
  • 在egg项目控制器或者服务里面使用 mongoose

    // {app_root}/app/controller/user.js
    exports.index = function* (ctx) {ctx.body = await ctx.model.User.find({});
    }
    
  • 注意:上面和之前的写法都只是举例,我们在项目中不会在控制器中进行数据的查询,我们会把数据处理工作,放入service中

  • 我们会专门新建一个app/service目录,用于存放提供数据的服务,如app/service/user.js

    'use strict';const Service = require('egg').Service;class UserService extends Service {async getUserList() {return this.ctx.model.User.find({});}
    }module.exports = UserService;
    
  • 之后在controller中调用即可

    'use strict';const Controller = require('egg').Controller;class UserController extends Controller {async index() {const { ctx } = this;ctx.body = await this.service.user.getUserList();}
    }module.exports = UserController;
    
  • 继续编写,我们把UserService中的CRUD补全

    // 增加用户
    async addUser(userObj) {const user = new this.ctx.model.User(userObj);return await user.save();
    }// 编辑用户
    async editUserById(uid, userObj) {return await this.ctx.model.User.updateOne({_id: uid,}, userObj);
    }// 删除用户
    async removeUserById(uid) {return await this.ctx.model.User.deleteOne({ _id: uid });
    }
    

关联查询

基于之前的举例,订单和订单详情进行多表查询

  • 配置app/model/order.js

    'use strict';module.exports = app => {// 引入建立连接的mongoose
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;// 数据库表的映射
    const OrderSchema = new Schema({order_id: String,uid: Number,trade_no: String,all_price: Number,all_num: Number,
    });
    return mongoose.model('Order', OrderSchema, 'order');
    };
    
  • 在controller中进行调用测试(应该封装在service中,此处仅作演示)

    'use strict';const Controller = require('egg').Controller;class OrderController extends Controller {async index() {const { ctx } = this;/* 最简单的方式,只查询订单const orderResult = await ctx.model.Order.find({});ctx.body = orderResult;*/// 关联查询订单详情表ctx.body = await ctx.model.Order.aggregate([{$lookup: {from: 'order_item',localField: 'order_id',foreignField: 'order_id',as: 'items',},},{$match: { all_price: { $gte: 90 } },},]);}
    }module.exports = OrderController;
    

Eggjs笔记:egg-mongoose插件的集成,crud操作, 多表关联查询相关推荐

  1. 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作

    MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...

  2. Mongoose aggregate 多表关联查询

    1. 查询每个order订单中的所有orderItem(多表关联查询) order.js: var mongoose = require('./db.js')var OrderSchema = mon ...

  3. Eggjs Sequelize 多表关联查询

    写服务端的新手,我们项目用nodejs写服务端,框架是egg.js.对于简单的 增.删.改.查 新手的我也是快速上手了,但是当我遇到需要关联其他表查询时,我就懵逼了,不知道怎么关联啊.几经周折,总算搞 ...

  4. MyBatis框架学习笔记02:使用MyBatis实现CRUD操作

    文章目录 Ⅰ.查询表记录 (Ⅰ).在映射器配置文件里引入结果映射元素 (Ⅱ).添加按姓名查询用户记录功能 1).在UserMapper.xml里添加映射语句 - findByName 2).在User ...

  5. MyBatis框架学习笔记02:利用MyBatis实现CRUD操作

    文章目录 一.打开MyBatisDemo项目 二.查询表记录 (一)在映射器配置文件里引入结果映射元素 (二)添加按姓名查询用户记录功能 1.在UserMapper.xml里添加映射语句 - find ...

  6. JDBC的CRUD操作之PreparedStatement的查询操作

    @Test/*** 查询操作*/public void demo4(){Connection conn = null;PreparedStatement pstmt = null;ResultSet ...

  7. oracle 5表关联查询,Oracle学习笔记5 - 表查询

    Oracle学习笔记五 --- 表查询  下面使用scott用户,用到的表见底部 1.查看表结构 desc [表名] desc emp 2.distinct命令,去除重复行 3.练习 查找SMIT ...

  8. F005MyBatis学习笔记-MyBatis的多表关联查询

    一. 概述 1.一对一 举例:身份证号对人,一个身份证好只能对应一个人,一个人也只能对应一个身份证号,这就是一对一: 特例:Mybatis将多对一看做是一对一: 2.多对多 举例:学生对老师,一个老师 ...

  9. egg mysql 连表查询_Egg中使用Sequelize框架关联查询Mysql数据库

    Sequelize视频教程_Eggjs仿小米商城企业级Nodejs项目实战视频教程: https://www.itying.com/goods-941.html 一.Sequelize简介 前面的章节 ...

最新文章

  1. python 解码json数据并在一个OrderdDict中保留其顺序
  2. 香帅的北大金融学课笔记2 -- 银行
  3. C# 单例模式的多种简单实现
  4. jquery手写轮播图_15个超强的jQuery/HTML5图片轮播插件
  5. TCP 连接中的TIME_WAIT
  6. vue-amap使用教程
  7. 【网络知识】Wireshark抓不到vlan tag问题解决
  8. 3ds Max学习指南,基本知识与基本操作,常用快捷键汇总
  9. 程序没问题但是报错Could_not_autowired
  10. 问题 A: Beer Barrels
  11. 重启osd服务失败:Start request repeated too quickly
  12. 华为数字化转型之道第四讲
  13. 笔者在国庆期间发文的感概:思绪万千
  14. 37d43641ef34f1a8a47c803dcf5a13793e3b9fef
  15. 乐园管理系统| 乐园小程序 | 数字化门店会员管理
  16. 未越狱设备 安装ipa
  17. Spark数据分析之第4课
  18. Visual Studio运行C语言程序(第一个程序)
  19. 上帝的心态发生了改变---太原市-------从热血沸腾到麻木不仁
  20. 如何快速测试面试者办公软件水平,金山办公软件校园招聘面试经验_金山办公软件2022校园招聘求职经验_大街网...

热门文章

  1. Can't connect to MySQL server (10060)异常解决方法
  2. Impala入门学习与使用详解
  3. 关机整蛊小程序(c语言实现)
  4. Android Studio打地鼠小游戏
  5. 什么是 Headless CMS?
  6. SCU - 4572 醉后不知天在水,满船清梦压星河【思维】
  7. docker部署项目通过127.0.0.1访问数据库:Connection refused
  8. 什么是微服务?微服务架构的优缺点、应用
  9. kettle定时备份->mysql+mongoDB增量备份
  10. WebApp 安全风险与防护课堂(第二讲)开课了!