博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
egg-mongoose专题
阅读量:5787 次
发布时间:2019-06-18

本文共 10182 字,大约阅读时间需要 33 分钟。

导读

egg-从入门到上线 (上)

egg-从入门到上线 (下)

1 安装与配置

1.0 介绍

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组

1.1 mac电脑安装教程

1.1.1 安装homebrew

homebrew的安装查看官网,安装完成后,在终端中输入以下命令更新homebrewpackage数据库

brew update复制代码

提示:brew update升级brew的版本库,brew outdated 查看outdated的库和应用,brew upgrade 升级outdated的库和应用,brew cleanup 清理调过期的库和应用

1.1.2 安装mongodb

使用homebrew安装mongodb,在MAC的终端中输入

cd / 复制代码
brew install mongodb复制代码

若要查看安装信息

brew info mongodb复制代码

查看mongodb的版本

mongo --version复制代码
which mongod复制代码

/usr/local/bin/mongod

如果这样了就安装成功了

启动服务

sudo mongod复制代码

1.2 手动部署服务器

1.2.1 下载安装包

wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz复制代码

下载完成后解压缩压缩包

tar zxf mongodb-linux-i686-1.8.2.tgz复制代码

1.2.2. 安装准备

将mongodb移动到/usr/local/server/mongdb文件夹

mv mongodb-linux-i686-1.8.2 /usr/local/mongodb复制代码

创建数据库文件夹与日志文件

mkdir /usr/local/mongodb/datatouch /usr/local/mongodb/logs复制代码

1.2.3. 设置开机自启动

将mongodb启动项目追加入rc.local保证mongodb在服务器开机时启动

echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data –logpath=/usr/local/mongodb/logs –logappend  --auth -–port=27017" >> /etc/rc.local复制代码

1.2.4. 启动mongodb

cd到mongodb目录下的bin文件夹启动mongodb

下面这个是需要权限的登录方式, 用户连接需要用户名和密码

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --auth  --port=27017 --fork复制代码

这个是不需要密码的(不建议)

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --port=27017 --fork复制代码

1.3 宝塔一键完成

1.4 设置密码

1.4.1 进入安装路径的bin目录

cd /www/server/mongodb/bin复制代码

1.4.2 输入命令行mongo,进入mongodb环境

mongo复制代码

1.4.3 切换到 admin 数据库

use admin复制代码

1.4.4 给admin设置用户密码

  • user: 用户名
  • pwd: 用户密码
  • roles: 用来设置用户的权限,比如读,读写 等等
db.createUser({user: 'root', pwd: 'admin_mima', roles: ['root']})复制代码

1.4.5 验证是否添加成功,db.auth(用户名,用户密码)

db.auth('root', 'admin_mima') 复制代码

如果返回 '1’表示验证成功, 如果是 ‘0’ 表示验证失败。

1.4.6 创建一个新的数据库,例如asGiant

use asGiant复制代码

1.4.7  接下来为asGiant库添加一个用户,并且赋予权限,

db.createUser({ user: 'aaaa', pwd: 'graphql_mima', roles: [{ role: 'readWrite', db: 'asGiant' }] })复制代码

这行代码意思是 创建一个cccc用户 给予读写权限 db表示该用户操作的数据库名。

  • Read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
  • userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  • root:只在admin数据库中可用。超级账号,超级权限

1.4.8 开启安全登录

一切搞定,重新开机mongodb,通过增加 --auth 开启安全登录

mongod --dbpath /www/server/mongodb/data --auth复制代码

如果你是手动安装,那么需要以下操作

mongodb,MongoDB默认是没有开启访问控制,我们通过--auth参数重启mongod服务。

mongod --dbpath 存放数据库文件夹路径 --auth

mongod --dbpath usr/local/mongodb/bin --auth复制代码

一旦开启了,用户连接mongod必须指定用户名和密码。

如果你采用的是宝塔一键完成的

可以通过修改mongodb的配置文件来实现

修改为

net:  port: 27017  bindIp: 0.0.0.0 #operationProfiling:#replication:#    replSetName: bt_main   security:  authorization: enabled  javascriptEnabled: false复制代码
  • bindIp修改为 0.0.0.0 允许外网访问
  • authorization 修改为 enabled 开启认证
    重启一下mongodb

1.5 放行端口

2 工具连接

2.1 下载robo 3t

创建一个连接

点击test

安装完成

2.2 连接加密数据库

xxx.db('mongodb://your name: your pwd@ip:27017/asgiant');

your name:为用户名
your pwd:为密码

3 数据备份还原

当mongodb 数据库打开了 auth认证 以后 就不能直接使用 dump 而需要提供对应的账号密码 如下

mongodump -h 127.0.0.1:27017 -d asGiant -u 'myz' -p '123456' -o /usr/local/mongodb/dump复制代码

-h 地址

-d 数据库名称
-u 用户名
-p 密码
-o 输出地址
--authenticationDatabase admin 验证账户的数据库

mongorestore命令脚本语法如下:

mongorestore -h 
<:port> -d dbname
复制代码
  • **--host <:port>, -h <:port>:**MongoDB所在服务器地址,默认为: localhost:27017
  • **--db , -d :**需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • **--drop:**恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • **:**mongorestore 最后的一个参数,设置备份数据所在位置,例如:/usr/local/mongodb/dump。
    你不能同时指定 和 --dir 选项,--dir也可以设置备份目录。
  • **--dir:**指定备份的目录
    你不能同时指定 和 --dir 选项。
mongorestore -h localhost:27017 -d asGiant -c user --dir /usr/local/mongodb/dump -u myz -p 12346复制代码

mongodump -u root -p 123456

mongorestore  -u root -p 123456

4 egg-mongoose 配置

4.1 安装

$ npm install egg-mongoose --save复制代码

4.2 配置

改变Egg项目中的配置文件{workplace}/config/plugin.js中来启用 egg-mongoose 插件:

exports.mongoose = {  enable: true,  package: 'egg-mongoose',};复制代码

4.3 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,      },    },  };复制代码

连接方法

config.mongoose = {    client: {      url: 'mongodb://账号:密码@服务器:端口/库名',      options: {},    },  };复制代码

5 设计数据库模型

5.1 定义模型,也就是数据表

在{workplace}/app/model/article.js定义数据表

'use strict';module.exports = app => {  const mongoose = app.mongoose;  const Schema = mongoose.Schema;  const RoleSchema = new Schema({    role: {      type: String,      index: {        unique: true,      }, // 该字段为唯一字段      require: true, // 必填项    },    roleName: {      type: String,      require: true,    },    // 备注    note: {      type: String,      require: true,    },  });  return mongoose.model('Role', RoleSchema, 'role');};复制代码

5.2 数据类型

数据类型
Number 数字
String 字符串
Boolean 布尔值
ObjectId 对象ID
Array 数组
Date 日期
Buffer 二进制
Mixed 混合类型

6 增加数据

this.ctx.model.Article.create(post,callback);复制代码

备注:其中post为json数据结构,callback为操作后的回调函数

7 查询数据

7.1 获取所有数据,返回是一个数组

this.ctx.model.Article.find()复制代码

7.2 获取一个数据,返回是一个对象

this.ctx.model.Article.findOne()复制代码

7.3 条件查询

this.ctx.model.Article.find(conditions,callback);复制代码

condition有以下几种类型

7.3.1 根据具体数据进行查询

this.ctx.model.Article.find({_id:5c4a819fb87ba4002a47bc4f,title:"123"},callback);复制代码
  • 返回_id为5c4a819fb87ba4002a47bc4f,title为123的结果

7.3.2 条件查询

"$lt" 小于
"$lte" 小于等于
"$gt" 大于
"$gte" 大于等于
"$ne" 不等于
this.ctx.model.Article.find({“sort”:{ $get:18 , $lte:30 });复制代码
  • 返回Article表中sort 大于等于18并小于等于30的结果

7.3.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"的结果

7.3.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属性的结果});复制代码

7.3.5 匹配正则表达式查询

MongoDb 是使用 Prel兼容的正则表达式库来匹配正则表达式

this.ctx.model.Article.find( {
"name" : /joe/i } );复制代码
  • 返回Article表中name为 joe 的结果, 并忽略大小写

7.3.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.3.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的所有数据

8 删除数据

this.ctx.model.Article.remove(conditions,callback);复制代码

备注:conditions为查询条件,与查询数据介绍的一样,eg:{ _id:5c4a819fb87ba4002a47bc4f },找到_id为5c4a819fb87ba4002a47bc4f的数据,callback为操作成功后的回调函数

9 更新数据

9.1 更新数据

this.ctx.model.Article.update(conditions, update, callback)复制代码
  • 参数1:查询条件, 参数2:更新对象,可以使用MondoDB的更新修改器

备注:conditions与查询数据中介绍的一样

9.2 update为更新对象

let post = {    wid: '5c492c57acbe363fd4824446',    column: [ '新闻' ],    titleHead: '',    img: '',    isAbstract: 'false',}this.ctx.model.Article.update({ _id: '5c4a819fb87ba4002a47bc4f ' }, post)复制代码
  • 查询Article表中特定_id,并对post中所包含的属性进行更新。

update使用MondoDB的更新修改器,有以下几种使用场景

9.2.1 "$inc"增减修改器,只对数字有效

this.ctx.model.Article.update({
"age":22}, {
$inc:{
"age":1} } );复制代码
  • 找到age=22的文档,修改文档的age值自增1

9.2.2 '$set' 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.

this.ctx.model.Article.update({ _id:5c4a819fb87ba4002a47bc4f }, { $set: { isDelete: true } });复制代码
  • 对5c4a819fb87ba4002a47bc4f 表进行软删除,找到特定_id数据,增加或者修改isDelete属性

9.2.3 "$unset"同上取反,删除一个键

this.ctx.model.Article.update({
age:22}, {
$unset:{
age:18} } );复制代码
  • 执行后age键不存在

9.2.4 '$push'给一个键push一个数组成员,键不存在会创建,对数组有效

this.ctx.model.Article.update({
name:'wxw'}, {
$push:{
array:10} } );复制代码
  • 返回Article表中name为wxw的数据,增加一个array键,类型为数组,有一个成员 10

9.2.5 '$addToSet'向数组中添加一个元素,如果存在就不添加

this.ctx.model.Article.update({
name:'wxw'},{
$addToSet:{
array:10} } );复制代码
  • 返回Article表中name为wxw的数据,array中有10所以不会添加

9.2.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]

9.2.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可以删除数组首部元素

9.2.8 '$pull' 向数组中删除指定元素

this.ctx.model.Article.update({
name:'wxw'}, {
$pull:{
array:10} });复制代码
  • 返回Article表中name为wxw的数据,匹配到array中的10后将其删除。

10 排序(sort)

this.ctx.model.Article.sort({ isSetTop: -1, sort: 1, editTime: -1 });复制代码
  • 对Article表中的数据进行排序,先按“isSetTop”降序,再按“sort”升序,最后按“editTime”降序

备注:键对应数据中的键名,值代表排序方向,1 升序, -1降序。

11 限制返回结果的数量(limit)

this.ctx.model.Article.limit(3);复制代码
  • 对Article表中的数据进行返回,返回为前面3条数据

12 跳过前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”降序进行排序。

转载于:https://juejin.im/post/5cf497a25188254a842503a3

你可能感兴趣的文章
smarty手记2
查看>>
Windows server 2012 新功能试用---- powershell 3.0 进程和服务的操作
查看>>
c#开源消息队列中间件EQueue 教程
查看>>
Routeros2.9.7安装总结
查看>>
关于人工智能的实现(猜测)
查看>>
什么是DBA[WHAT'S MEANING OF DBA]
查看>>
Hyper-V Server 虚拟光纤通道
查看>>
IDEA控制台输出中文乱码的问题及解决方案
查看>>
VDI序曲三十 APP-V4.6SP1之OFFICE07补丁升级
查看>>
我的“技术架构”之旅
查看>>
资源组 —— 助你轻松解决单账户内的资源分组管理难题
查看>>
VS2008SP1下jQuery使用初体验
查看>>
怎样有效地推广APP
查看>>
活动目录中组的类型和可用范围
查看>>
烂泥:CentOS命令学习之scp复制
查看>>
网络钓鱼和欺诈相关专题
查看>>
Hyper-V 3.0网络虚拟化PART 3:内部交换机
查看>>
在Firefox中通过AJAX跨域访问Web资源
查看>>
敏捷团队如何进行绩效考核?
查看>>
在危机中呈现转机的网络管理
查看>>