楼主: dlmxv90851
1640 0

Android 应用程序构建实战+原理精讲 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

96%

还不是VIP/贵宾

-

威望
0
论坛币
266 个
通用积分
55.0568
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1668 点
帖子
98
精华
0
在线时间
69 小时
注册时间
2020-4-17
最后登录
2024-9-19

楼主
dlmxv90851 发表于 2022-9-14 18:19:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
Android 应用程序构建实战+原理精讲

Mongoose 在egg中的运用

Mongoose是什么?

Mongoose是MongoDB的一个对象模型工具,封装了许多MongoDB对文档的的增删改查等常用办法,让NodeJS操作Mongodb数据库变得愈加灵敏简单。

在egg项目中如何运用?1、装置

npm i egg-mongoose --save

2、配置

在根目录下的/config/plugin.js中配置插件

exports.mongoose = {  enable: true,  package: 'egg-mongoose',};3、衔接数据库

在根目录下的/config/config.default.js增加配置,其中url为我们的数据库地址,可经过环境变量来辨别开发环境还是消费环境,并且肯定能否运用用户名密码的数据库
const prod = process.env.npm_config_server_prod;

mongoose: {      client: {        url: prod ? 'mongodb:eggadmin:123456@localhost:27017/DbName' : 'mongodb://127.0.0.1:27017/DbName',        options: {          useUnifiedTopology: true,        },      },    },4、配置与运用(1)数据表配置

在app目录下新建model文件夹,在model文件夹下新建JS文件作为数据表的配置内容,下面以书籍表的配置为例

'use strict';/** * @description: Mongoose book Schema, */module.exports = app => {  const mongoose = app.mongoose;  const Schema = mongoose.Schema;  const BookSchema = new Schema({    desc: { type: String }, /* 书籍描绘 */    name: { type: String }, /* 书籍称号 */    press: { type: String }, /* 出版社 */    author: { type: String }, /* 作者 */    image: { type: Array }, /* 书籍图片列表*/    price: { type: String }, /* 价钱 */    book_type: { /* 书籍分类id */      type: Schema.Types.ObjectId,      ref: 'BookClassify',    },    user: { /* 书籍发布者id */      type: Schema.Types.ObjectId,      ref: 'User',    },    create_time: { type: String }, /* 创立时间 */    status: { type: String }, /* 状态,1:待购置,2:已购置*/    look: { type: Number } /* 阅读数量 */  });  return mongoose.model('Book', BookSchema);};

能够看到我们能够经过Schema来定义表构造,能够指定字段的类型及关联,设置完字段后就能够生成model了,这里算是十分简单的配置,更多配置办法可参考文档

(2)、运用mongoose办法

配置完数据表构造后,我们就能够再service层中调用mongoose的办法对文档停止增删查改了,已书籍列表的处置逻辑为例子

    async findbookList(data) {      const { type, page, pageSize, desc, status, userId } = data;      const searchVal = {}      if (type) {        searchVal.book_type = mongoose.Types.ObjectId(type)      }      if (status) {        searchVal.status = status      }      if (userId) {        searchVal.user = mongoose.Types.ObjectId(userId)      }      const search_term = {        $or: [          { desc: { $regex: desc ? desc : '', $options: '$i' } },          { name: { $regex: desc ? desc : '', $options: '$i' } },          { author: { $regex: desc ? desc : '', $options: '$i' } },          { press: { $regex: desc ? desc : '', $options: '$i' } },        ],      };      const totalNum = await this.ctx.model.Book.find(searchVal).and(search_term).countDocuments();      const result = await this.ctx.model.Book.find(searchVal)        .populate({          path: 'user',          select: { name: 1, image: 1 }        })        .populate({          path: 'book_type'        })        .and(search_term)        .sort({ create_time: -1 })        .skip((parseInt(page) - 1) * parseInt(pageSize))        .limit(parseInt(pageSize));        return result ? { bean: {          records: result,          current: page,          size: result.length,          total: totalNum,        }, ...app.config.msg.GET_SUCCESS } : app.config.msg.GET_ERR;    }

能够看到,经过this.ctx.model.Book就能够获取到Book的model并且能够调用mongoose需求的办法,例如populate、find、and、sort、skip、limit 等等。

5、egg-Mongoose常用的办法增加数据this.ctx.model.Book.create(data,callback);

其中data为json数据构造,callback为操作后的回调函数

查询数据获取一切数据,返回是一个数组this.ctx.model.Book.find()获取一个数据,返回是一个对象this.ctx.model.Book.findOne()条件查询this.ctx.model.Article.find(conditions,callback);

其中conditions为查询的条件,callback为回调函数
conditions有一下几种状况:

详细数据:

this.ctx.model.Book.find({_id:5c4a19fb87ba4002a47ac4d, name: "射雕英雄传" }, callback);

条件查询:

"$lt"    小于"$lte"    小于等于"$gt"    大于"$gte"    大于等于"$ne"    不等于// 查询价钱大于100小于200的书籍数组this.ctx.model.Book.find({ "price": { $get:100 , $lte:200 });

或查询 OR

"$in" 一个键对应多个值"$nin" 同上取反, 一个键不对应指定值"$or" 多个条件匹配, 能够嵌套 $in 运用"$not"    同上取反, 查询与特定形式不匹配的文档this.ctx.model.Book.find({"name":{ $in: ["射雕","倚天"]} );删除数据this.ctx.model.Book.remove(conditions,callback);更新数据this.ctx.model.Book.update(conditions, update, callback)

conditions为条件,update是更新的值对象

排序this.ctx.model.Book.sort({ create_time: -1 });

其中-1表示降序返回。 1表示升序返回

限制数量this.ctx.model.Book.limit(number);

number表示限制的个数

跳过文档返回this.ctx.model.Book.skip(number);

number表示跳过的个数,skip经常搭配limit完成分页的功用

条件数组and

在find后面可运用and对查询结果停止进一步条件挑选,相当于并且的意义。

const search_term = {        $or: [          { desc: { $regex: desc ? desc : '', $options: '$i' } },          { name: { $regex: desc ? desc : '', $options: '$i' } },          { author: { $regex: desc ? desc : '', $options: '$i' } },          { press: { $regex: desc ? desc : '', $options: '$i' } },        ],      };   this.ctx.model.Book.find().and(search_term)关联查询populate// 在model中配置字段时分指定关联的表名,就能够经过populate来停止表的关联查询user: { /* 书籍发布者id */      type: Schema.Types.ObjectId,      ref: 'User',    },    this.ctx.model.Book.find()        .populate({          path: 'user',          select: { name: 1, image: 1 }        })聚合管道Aggregatethis.ctx.model.Template.aggregate([        { $match: { name } },        { $sort: { create_time: -1 } },        { $group: { _id: '$name', user_id: { $first: '$modifier' } } },      ]);

Mongoose聚合管道aggregate常用的操作有$project 、$match 、$group、$sort、$limit、$skip、$lookup 表关联

批量操作bulkWrite const template_list = await ctx.model.Template.aggregate([      { $sort: { create_time: -1 } },      { $group: { _id: '$name', template_id: { $first: '$_id' }, label: { $first: '$label' } } },    ]);    const update_value = [];    template_list.forEach(item => {      if (!item.label) {        update_value.push({          updateOne: {            filter: { _id: item.template_id },            update: { label: '' },          },        });      }    });    await ctx.model.Template.bulkWrite(update_value);

能够停止一系列批量增加、删除、更新等操作。

mongoose还有十分多的办法能够提供应我的灵敏运用,我们在运用的时分能够分离业务逻辑选择适宜的办法来进步我们操作数据库的效率。

Android 应用程序构建实战+原理精讲

download链接:https://pan.baidu.com/s/1keNiN4br3HDjdxmy1zpU5A?pwd=y9rz

提取码:y9rz
--来自百度网盘超级会员V5的分享

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Android DROID 应用程序 ROI Description

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 16:47