Mongoose 在egg中的使用_MongoDB

来源:脚本之家  责任编辑:小易  

1、静态方法中不能2113调用非静态方法。5261 2、如果静态方法中必须要4102调用非静态方法,可以先new(实例1653),之后通过new实例的引用调用此类的方法。 3、如果一个类被实例化了,那么这个类中除了private的,都可以调用到www.zgxue.com防采集请勿采集本网。

Mongoose是什么?

就类似connect是一样的. 创建一知个执行连道 model.pre->schema.pre->schema.save model.pre 可以是具体业务逻辑的一些数据验回证,或者原始数据转换. schema.pre 跟业务无答关的数据操作

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

我曾经翻译过mongoose的文档,并对里面的很多例子进行了实践,虽然不多,一开始也有8.Middleware中间件 8.1 什么是中间件 中间件是一种控制函数,类似插件,能控制流程中的init、validate、save.

在egg项目中如何使用?

var mongoose=require(\"mongoose\");mongoose.connect(\"mongodb:/localhost/mydb01\");var User=mongoose.model(\"User\",{ id:Double,/报错指向这里,说 Double is not defined name:{ type:String,

1、安装

与使用连接字符串的方法比较相似,如下为mongoose连接localhost上的words数据库 var mongoose=require(‘mongoose’);mongoose.connect('mongodb:/localhost/words');该链接可用mongoose模块的

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 } })

聚合管道Aggregate

this.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还有非常多的方法可以提供给我的灵活使用,我们在使用的时候可以结合业务逻辑选择合适的方法来提高我们操作数据库的效率。在我们使用它之前可以认真的阅读官方文档

对于静态方法:我想查找所有的故事书(而且以后经常查找),但不想每次都用原生方法 Book.find({category:story}),写起来好麻烦,于是我就可以定义一个静态方法:以后就可以这么查 Book.isStory()就ok了对于实例方法:比如我想根据具体的一本书,比如《不平凡的世界》查找和和它类似的书,则定义实例方法 doc.isSimilar(xxx)。实例方法嘛,调用者是具体的实例,此处肯定不能用静态方法吧。以前仅供参考,希望有帮助,如果没帮助,可以看看java相关的,因为那里面也有静态方法实例方法,可以借鉴下思想内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • egg.js的基本使用和调用数据库的方法示例
  • 关于自定义egg.js的请求级别日志详解
  • koa+egg.js集成kafka消息队列的示例
  • mongoose更新对象的两种方法示例比较
  • 关于在mongoose中填充外键的方法详解
  • 利用mongoose让json数据直接插入或更新到mongodb
  • 详解nodejs基于mongoose模块的增删改查的操作
  • 关于mongoose连接mongodb重复访问报错的解决办法
  • mongodb中数据的替换方法实现类replace()函数功能详解
  • mongodb存储时间时差问题的解决方法
  • 十个提高mongodb安全性的配置技巧
  • mongodb中强大的统计框架aggregation使用实例解析
  • centos 6.4创建mongodb副本集
  • mongodb开启权限认证的方法步骤详解
  • mongodb 快速入门
  • mongodb与sql关系型数据比较
  • windows7下使用mongodb实现仓储设计
  • mongodb实现问卷/考试设计功能
  • mongoose中实例方法和静态方法分别在哪些业务上使用
  • mongoose中实例方法和静态方法分别在哪些业务上使用
  • 如何使用mongoose的api连接到db中一个已有的集合?
  • Mongoose怎么用一个 条件 在多个字段查询
  • 怎么理解 Mongoose 的 pre 中间件,还有 path
  • 怎么理解 Mongoose 的 pre 中间件,还有 path
  • mongoose中model怎么定义数据类型
  • 如何使用mongoose连接数据库中已经存在的一个集合
  • 如何用mongoose直接查询数据中的数量
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mongodbegg.js的基本使用和调用数据库的方法示例关于自定义egg.js的请求级别日志详解koa+egg.js集成kafka消息队列的示例mongoose更新对象的两种方法示例比较关于在mongoose中填充外键的方法详解利用mongoose让json数据直接插入或更新到mongodb详解nodejs基于mongoose模块的增删改查的操作关于mongoose连接mongodb重复访问报错的解决办法mongodb中数据的替换方法实现类replace()函数功能详解mongodb存储时间时差问题的解决方法十个提高mongodb安全性的配置技巧mongodb中强大的统计框架aggregation使用实例解析centos 6.4创建mongodb副本集mongodb开启权限认证的方法步骤详解mongodb 快速入门mongodb与sql关系型数据比较windows7下使用mongodb实现仓储设计mongodb实现问卷/考试设计功能mongodb常用操作命令大全mongodb各种查询操作详解mongodb数据库插入、更新和删除操mongodb 数据库操作--备份 还原 mongodb插入数据的3种方法mongodb中使用distinct去重的简单mongodb整库备份与还原以及单个cmongodb查询操作限制返回字段的方mongodb 实现远程连接浅谈mysql和mariadb区别(mariadbubuntu下安装mongodb 3.4的详细过程mongodb 复制(副本集)学习笔记mongodb eval 执行服务器端脚本mongodb中mapreduce实现数据聚合方法详解mongodb日常使用的技巧与注意事项汇总mongodb安装与配置笔记mongodb入门教程之c#驱动操作实例mongodb 多重数组查询(angularjs绑定显示mongodb中聚合函数java处理示例详解利用mongodb查询某坐标是否在规定多边形区
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved