egg-mongoose專題

導讀javascript

juejin.im/post/5c99cb… egg-從入門到上線 (上)java

juejin.im/post/5cf47b… egg-從入門到上線 (下)linux

1 安裝與配置

1.0 介紹

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組web

1.1 mac電腦安裝教程

1.1.1 安裝homebrew

homebrew的安裝查看官網,安裝完成後,在終端中輸入如下命令更新homebrewpackage數據庫正則表達式

brew update
複製代碼

提示:brew update升級brew的版本庫,brew outdated 查看outdated的庫和應用,brew upgrade 升級outdated的庫和應用,brew cleanup 清理調過時的庫和應用mongodb

1.1.2 安裝mongodb

使用homebrew安裝mongodb,在MAC的終端中輸入數據庫

cd / 
複製代碼
brew install mongodb
複製代碼

若要查看安裝信息npm

brew info mongodb
複製代碼

查看mongodb的版本json

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/data
touch /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 寶塔一鍵完成

image.png

1.4 設置密碼

1.4.1 進入安裝路徑的bin目錄

cd /www/server/mongodb/bin
複製代碼

1.4.2 輸入命令行mongo,進入mongodb環境

mongo
複製代碼

image.png

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必須指定用戶名和密碼。

image.png

若是你採用的是寶塔一鍵完成的

能夠經過修改mongodb的配置文件來實現

image.png

修改成

image.png

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 放行端口

image.png

2 工具鏈接

2.1 下載robo 3t

image.png

image.png

建立一個鏈接

image.png

image.png

點擊test

image.png

安裝完成

image.png

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 <hostname><:port> -d dbname <path>
複製代碼
  • **--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」降序進行排序。
相關文章
相關標籤/搜索