Egg中使用egg-mongoose和常用的Mongoose 方法
Mongoose
Mongoose就是一套操作MongoDB数据库的接口,而Egg中有对应的插件egg-mongoose。
安装
$ npm install egg-mongoose --save
配置
改变Egg项目中的配置文件{workplace}/config/plugin.js中来启用 egg-mongoose 插件:
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
Egg连接mongoose
在Egg项目中的配置文件{workplace}/config/default.js配置项config添加属性
config.mongoose = {
url: process.env.EGG_MONGODB_URL || 'mongodb://127.0.0.1/website',
options: {
server: {
poolSize: 40,
},
},
};
定义数据表
在{workplace}/app/model/article.js定义数据表
'use strict';
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const PostSchema = new Schema({
wid: {
type: String,
},
release: {
type: Boolean,
},
sort: {
type: Number,
},
img: {
type: String,
},
abstract: {
type: String,
},
text: {
type: String,
},
isSetTop: {
type: Number,
},
title: {
type: String,
},
keywords: {
type: String,
},
describe: {
type: String,
},
updateTime: {
type: Date,
},
num: {
type: Number,
},
uid: {
type: String,
},
editors: {
type: String,
},
disable: {
type: Boolean,
},
columnId: {
type: Schema.Types.ObjectId,
},
});
return mongoose.model('Article', PostSchema);
};
备注:其中type表示字段类型,Mongoose 有以下几种类型Number(数字),String(字符串),Boolean(布尔值),ObjectId(对象ID),Array(数组),Object(对象),Date(日期)。。。
常用的Mongoose 方法
一,增加数据
this.ctx.model.Article.create(post,callback);
备注:其中post为json数据结构,callback为操作后的回调函数
二,查询数据
1,获取所有数据,返回是一个数组
this.ctx.model.Article.find()
2,获取一个数据,返回是一个对象
this.ctx.model.Article.findOne()
3,条件查询
this.ctx.model.Article.find(conditions,callback);
condition有以下几种类型
1),根据具体数据进行查询
this.ctx.model.Article.find({_id:5c4a819fb87ba4002a47bc4f,title:"123"},callback);
- 返回_id为5c4a819fb87ba4002a47bc4f,title为123的结果
2),条件查询
"$lt" 小于
"$lte" 小于等于
"$gt" 大于
"$gte" 大于等于
"$ne" 不等于
this.ctx.model.Article.find({“sort”:{ $get:18 , $lte:30 });
- 返回Article表中sort 大于等于18并小于等于30的结果
3),或查询 OR
"$in" 一个键对应多个值
"$nin" 同上取反, 一个键不对应指定值
"$or" 多个条件匹配, 可以嵌套 $in 使用
"$not" 同上取反, 查询与特定模式不匹配的文档
this.ctx.model.Article.find({"title":{ $in:[20,21,22."haha"]} );
- 返回Article表中title等于20或21或21或"haha"的结果
this.ctx.model.Article.find({"$or" : [ {"age":18} , {"name":"wxw"} ] });
- 返回Article表中age等于18或 name等于"wxw"的结果
4),类型查询("$exists"
条件判定)
this.ctx.model.Article.find({name: {$exists: true}},function(error,docs){
//返回Article表中所有存在name属性的结果
});
this.ctx.model.Article.find({telephone: {$exists: false}},function(error,docs){
//返回Article表中所有不存在telephone属性的结果
});
5),匹配正则表达式查询
MongoDb 是使用 Prel兼容的正则表达式库来匹配正则表达式
this.ctx.model.Article.find( {"name" : /joe/i } );
- 返回Article表中name为 joe 的结果, 并忽略大小写
6),查询数组
this.ctx.model.Article.find({"array":10} );
- 返回Article表中array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到
this.ctx.model.Article.find({"array[5]":10} );
- 返回Article表中array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到
this.ctx.model.Article.find({"array":[5,10]});
- 返回Article表中查询匹配array数组中既有5又有10的结果
this.ctx.model.Article.find({"array":{$size : 3} });
- 返回Article表中查询匹配array数组长度为3 的的结果
this.ctx.model.Article.find({"array":{$slice : 10} });
- 返回Article表中查询匹配array数组的前10个元素
this.ctx.model.Article.find({"array":{$slice : [5,10]} });
- 返回Article表中查询匹配array数组的第5个到第10个元素
7),where
用它可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回
this.ctx.model.Article.find( {"$where" : "this.x + this.y === 10" } );
this.ctx.model.Article.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )
- 其中this为数据表中的数据,上述返回Article表中属性x+属性y=10的所有数据
三,删除数据
this.ctx.model.Article.remove(conditions,callback);
备注:conditions为查询条件,与查询数据介绍的一样,eg:{ _id:5c4a819fb87ba4002a47bc4f },找到_id为5c4a819fb87ba4002a47bc4f的数据,callback为操作成功后的回调函数
四,更新数据
this.ctx.model.Article.update(conditions, update, callback)
- 参数1:查询条件, 参数2:更新对象,可以使用MondoDB的更新修改器
备注:conditions与查询数据中介绍的一样
1,update为更新对象
let post = {
wid: '5c492c57acbe363fd4824446',
column: [ '新闻' ],
titleHead: '',
img: '',
isAbstract: 'false',
}
this.ctx.model.Article.update({ _id: '5c4a819fb87ba4002a47bc4f ' }, post)
- 查询Article表中特定_id,并对post中所包含的属性进行更新。
2,update使用MondoDB的更新修改器,有以下几种使用场景
1),"$inc"
增减修改器,只对数字有效
this.ctx.model.Article.update({"age":22}, {$inc:{"age":1} } );
- 找到age=22的文档,修改文档的age值自增1
2),'$set'
指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
this.ctx.model.Article.update({ _id:5c4a819fb87ba4002a47bc4f }, { $set: { isDelete: true } });
- 对5c4a819fb87ba4002a47bc4f 表进行软删除,找到特定_id数据,增加或者修改isDelete属性
3),"$unset"
同上取反,删除一个键
this.ctx.model.Article.update({age:22}, {$unset:{age:18} } );
- 执行后age键不存在
4),'$push'
给一个键push一个数组成员,键不存在会创建,对数组有效
this.ctx.model.Article.update({name:'wxw'}, {$push:{array:10} } );
- 返回Article表中name为wxw的数据,增加一个array键,类型为数组,有一个成员 10
5),'$addToSet'
向数组中添加一个元素,如果存在就不添加
this.ctx.model.Article.update({name:'wxw'},{$addToSet:{array:10} } );
- 返回Article表中name为wxw的数据,array中有10所以不会添加
6),'$each'
遍历数组和 $push 修改器配合可以插入多个值
this.ctx.model.Article.update({name:'wxw'}, {$push:{array:{$each: [1,2,3,4,5]}} } );
- 返回Article表中name为wxw的数据,执行后array : [10,1,2,3,4,5]
7),'$pop'
向数组中尾部删除一个元素
this.ctx.model.Article.update({name:'wxw'}, {$pop:{array:1} } );
- 返回Article表中name为wxw的数据,其中array : [10,1,2,3,4,5],执行后 array : [10,1,2,3,4]
- tip:将1改成-1可以删除数组首部元素
8),'$pull'
向数组中删除指定元素
this.ctx.model.Article.update({name:'wxw'}, {$pull:{array:10} });
- 返回Article表中name为wxw的数据,匹配到array中的10后将其删除。
五,排序(sort)
this.ctx.model.Article.sort({ isSetTop: -1, sort: 1, editTime: -1 });
- 对Article表中的数据进行排序,先按“isSetTop”降序,再按“sort”升序,最后按“editTime”降序
备注:键对应数据中的键名,值代表排序方向,1 升序, -1降序。
六,限制返回结果的数量(limit)
this.ctx.model.Article.limit(3);
- 对Article表中的数据进行返回,返回为前面3条数据
七,跳过前3个文档,返回其余的(skip)
this.ctx.model.Article.skip(3);
- 对Article表中的数据进行返回,跳过前面3条数据,返回其余数据
附:综合使用最后三个方法进行分页查询
this.ctx.model.Article.find({ _id:5c4a819fb87ba4002a47bc4f }).skip(pageSize * (pageNum - 1)).limit(parseInt(pageSize)).sort({ isSetTop: -1, sort: 1, editTime: -1 });
- 其中pageSize和pageNum为动态传递数据,返回Article表中特定_id在每页数据为pageSize条件下的第pageNum页中的数据,并按照“isSetTop”降序,再按“sort”升序,最后按“editTime”降序进行排序。
Egg中使用egg-mongoose和常用的Mongoose 方法的更多相关文章
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- 在网页中JS函数自动执行常用三种方法
在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT LANGUAGE="JavaScript"> function ...
- MySQL中优化sql语句查询常用的种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- js中字符串和数组的常用转换处理方法
1.split("分割条件(正则表达式或者字符)") 字符串 ==> 数组 默认返回数组 (1) 将单词分割为字符 "hello".split(" ...
- 网页中JS函数自动执行常用三种方法
(1)最简单的调用方式,直接写到html的body标签里面: <body onload="myFunction()"></body> ...
- 在egg中配置cors
在egg中配置 cors(跨域) 第一步,安装 egg-cors npm i egg-cors --save 第二步,配置 cors 在config/plugin.js文件下添加: exports.c ...
- JS数组常用函数以及查找数组中是否有重复元素的三种常用方法
阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法 1. var ary = new Array(&qu ...
- jQuery中ajax的4种常用请求方式
jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...
- jQuery中常用的函数方法
jQuery中常用的函数方法总结 Ajax处理 load(url,[data],[callback]) url (String) : 待装入 HTML 网页网址. data (Map) : (可选) ...
随机推荐
- json.dump和json.dumps区别,json.load和json.loads的区别
dumps是将python类型(list,dict等)转化成str格式,loads是将str转化成python类型(list,dict等). dump和load也是类似的功能,只是与文件操作结合起来了 ...
- Linux命令行报错 bash: cannot create temp file for here-document: No space left on device
今天Linux服务器出问题了,使用"tab"补全命令时,提示 bash: cannot create temp file for here-document: No space l ...
- python入门(二):isinstance、内置函数、常用运算等
1. isinstance(变量名,类型) #判断什么类型 ps: 只支持输入两个参数,输入3个参数会报错 >>> isin ...
- 搭建EOS环境
[搭建EOS环境] 1.Ubuntu 18.04 下安装eosio wget https://github.com/eosio/eos/releases/download/v1.4.4/eosio_1 ...
- NTFS(Windows)、ext4(RHEL6)和xfs(RHEL7)文件系统的误删除恢复和备份
前言 对于误删除文件的设备,要马上停止任何写的操作,防止删除的文件被覆盖,导致数据丢失! 恢复NTFS文件系统下误删的文件 以Windows为例,市面上能恢复的工具不少,例如EasyRecovery. ...
- Oracle导出csv时数字不变成科学计数法
导出成CSV后,用excel打开,点击excel的[数据]→[自文本],选择导出的csv文件,下一步,分隔符选择[逗号],下一步,选择所有列“按住shift+鼠标左键选取”后,列数据格式选文本,[完成 ...
- 转)Ubuntu16.04下安装DDD(Data Display Debugger)
以下转自:http://www.linuxdiyf.com/linux/26393.html 前两天在Linux论坛偶然间看到了DDD这个软件,根据介绍是一个gdb界面化的调试软件,这正是我找了好 ...
- React-router4 简单总结
官方文档读到这里,大概明白了React-router是专门为单页面设计的,,我只能说多页面格外的不方便 首先这个是基本的套路 import React from 'react' import Reac ...
- rsync简介与rsync+inotify配置实时同步数据
rsync简介 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. rsync特性 rsync ...
- 1.3eigen中数组类和系数的运算
1.3数组类和系数的运算 与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数. 1.数组类型 跟矩阵类 ...