Eggjs笔记:egg-mongoose插件的集成,crud操作, 多表关联查询
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操作, 多表关联查询相关推荐
- 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...
- Mongoose aggregate 多表关联查询
1. 查询每个order订单中的所有orderItem(多表关联查询) order.js: var mongoose = require('./db.js')var OrderSchema = mon ...
- Eggjs Sequelize 多表关联查询
写服务端的新手,我们项目用nodejs写服务端,框架是egg.js.对于简单的 增.删.改.查 新手的我也是快速上手了,但是当我遇到需要关联其他表查询时,我就懵逼了,不知道怎么关联啊.几经周折,总算搞 ...
- MyBatis框架学习笔记02:使用MyBatis实现CRUD操作
文章目录 Ⅰ.查询表记录 (Ⅰ).在映射器配置文件里引入结果映射元素 (Ⅱ).添加按姓名查询用户记录功能 1).在UserMapper.xml里添加映射语句 - findByName 2).在User ...
- MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
文章目录 一.打开MyBatisDemo项目 二.查询表记录 (一)在映射器配置文件里引入结果映射元素 (二)添加按姓名查询用户记录功能 1.在UserMapper.xml里添加映射语句 - find ...
- JDBC的CRUD操作之PreparedStatement的查询操作
@Test/*** 查询操作*/public void demo4(){Connection conn = null;PreparedStatement pstmt = null;ResultSet ...
- oracle 5表关联查询,Oracle学习笔记5 - 表查询
Oracle学习笔记五 --- 表查询 下面使用scott用户,用到的表见底部 1.查看表结构 desc [表名] desc emp 2.distinct命令,去除重复行 3.练习 查找SMIT ...
- F005MyBatis学习笔记-MyBatis的多表关联查询
一. 概述 1.一对一 举例:身份证号对人,一个身份证好只能对应一个人,一个人也只能对应一个身份证号,这就是一对一: 特例:Mybatis将多对一看做是一对一: 2.多对多 举例:学生对老师,一个老师 ...
- egg mysql 连表查询_Egg中使用Sequelize框架关联查询Mysql数据库
Sequelize视频教程_Eggjs仿小米商城企业级Nodejs项目实战视频教程: https://www.itying.com/goods-941.html 一.Sequelize简介 前面的章节 ...
最新文章
- python 解码json数据并在一个OrderdDict中保留其顺序
- 香帅的北大金融学课笔记2 -- 银行
- C# 单例模式的多种简单实现
- jquery手写轮播图_15个超强的jQuery/HTML5图片轮播插件
- TCP 连接中的TIME_WAIT
- vue-amap使用教程
- 【网络知识】Wireshark抓不到vlan tag问题解决
- 3ds Max学习指南,基本知识与基本操作,常用快捷键汇总
- 程序没问题但是报错Could_not_autowired
- 问题 A: Beer Barrels
- 重启osd服务失败:Start request repeated too quickly
- 华为数字化转型之道第四讲
- 笔者在国庆期间发文的感概:思绪万千
- 37d43641ef34f1a8a47c803dcf5a13793e3b9fef
- 乐园管理系统| 乐园小程序 | 数字化门店会员管理
- 未越狱设备 安装ipa
- Spark数据分析之第4课
- Visual Studio运行C语言程序(第一个程序)
- 上帝的心态发生了改变---太原市-------从热血沸腾到麻木不仁
- 如何快速测试面试者办公软件水平,金山办公软件校园招聘面试经验_金山办公软件2022校园招聘求职经验_大街网...
热门文章
- Can't connect to MySQL server (10060)异常解决方法
- Impala入门学习与使用详解
- 关机整蛊小程序(c语言实现)
- Android Studio打地鼠小游戏
- 什么是 Headless CMS?
- SCU - 4572 醉后不知天在水,满船清梦压星河【思维】
- docker部署项目通过127.0.0.1访问数据库:Connection refused
- 什么是微服务?微服务架构的优缺点、应用
- kettle定时备份->mysql+mongoDB增量备份
- WebApp 安全风险与防护课堂(第二讲)开课了!