在Egg中使用MongoDB及Mongoose

2021-09-26 07:16:44 字數 3151 閱讀 8786

新公司的專案中用了egg和mongodb及mongoose。最近有空來系統的梳理一下。

egg 使用 egg-mongoose來方便的跟資料庫進行鏈結

// eggproject/server/config/config.default.ts

// 單資料庫鏈結

mongoose:

,// 多資料庫鏈結

mongoose:,}

,// 資料庫2

db2:,}

,},}

,// 多資料庫鏈結時,在model中要指定是哪個

module.

exports

, password:,}

);return conn.

model

('user'

, userschema)

;}

export

, account:

,// 唯一

password:

, comments:

,// 物件陣列

tags:

// 字串陣列,對欄位增加索引

meta:

, h:

,// 別名,使用時無縫連線},

// schema 的選項options

,// 生成時間},

);// 還可以定義例項方法,定義方法時 不要使用 箭頭函式。

userschema.method.

somefun

=function

(cb)

, cb);}

// mongoose會自動給下邊的user加上s,也就是說真正的表名應該是users

return connect.

model

('user'

, userschema)

;// 如果不想這樣,可以寫第三個引數手動指定表名如下,這樣表名就是user了。

return connect.

model

('user'

, userschema,

'user');

};

virtuals 是 document 的屬性,但是不會被儲存到 mongodb,所以也不能用來查詢。 getter 可以用於格式化和組合字段資料, setter 可以很方便地分解乙個值到多個字段。

personschema.

virtual

('fullname').

// 定義乙個虛擬值 fullname,他並不會被儲存到資料庫裡,只會把first和last拼接出來返回

get(

function()

).// 定義虛擬值如果是 setter,會把值自動拆分到其他屬性

set(

function

(v))

;

注意:如果對 document 使用 tojson() 或 toobject(),預設不包括虛擬值, 你需要額外向 toobject() 或者 tojson() 傳入引數 。

schemas 有很多可配置選項,你可以在構造時傳入或者直接 set:

new

schema

(, options)

;// or

var schema =

newschema()

;schema.

set(option, value)

;

常見選項:

schematype 處理字段路徑各種屬性的定義

以下是 mongoose 的所有合法 schematypes:

// 可以簡單的直接寫型別

var schema1 =

newschema()

;// 也可以寫個物件,type表示型別。這樣還能加其他屬性

var schema2 =

newschema(}

);

全部字段可用的選項:

索引相關:

對字串:

對數字:

對日期:

常用方法:

詳見:mongoose中文文件-mongoose的api

用於構建聚合管道的聚合建構函式。通過model.aggregate()構造使用。

詳見: aggregate

aggregate能夠在查詢資料時做各種複雜的操作,包括查詢,過濾,排序,分組,增加字段組合計算等等,十分強大!下面是例子。

但是,下面的例子中,如果addfields中增加的字段很通用,其實可以試著使用schema中的虛擬值(virtual),通過設定setter和getter也能達到了類似的效果,並且寫法也比這個更友好。這是我梳理總結時思考出來的,在之後的開發中,要盡可能使用更簡單的方式。

const result =

await ctx.model.***x.

aggregate([

,// 匹配出符合條件的資料},

,// 按資料生成時間倒序排列},

,// waitunfreezeamount 待解凍本金 = amount * 鎖倉率 freezeratio - 已解凍本金 $unfreezeamount

waitunfreezeamount:

,'$unfreezeamount'],

},// interest 已產生利息 = 已解凍利息 unfreezeinterest + 待解凍利息 waitunfreezeinterest

interest:,}

,},// 根據幣種分組,求和

, totalinterestpercoin:

, waitunfreezepercoin:

, unfreezepercoin:

, totalludpercoin:

, countpercoin:,}

,},]

);

在 Docker 中使用 MongoDB

如果你是一名 mongodb 的初學者,那麼你入門 mongodb 的第一件事就是安裝,但是安裝 mongodb 還需要自己配置一些服務。這時候,docker 就能幫上大忙,它能夠讓你不需要本地安裝 mongodb 就能使用。首先你的電腦上需要 安裝 docker,然後在 docker 的映象中查詢...

egg 中使用中介軟體

中介軟體這個東西 運用得到 可以幫我們解決一些不必要放在路由中的一些邏輯處理 在使用者匹配到路由 之前 或者 之後 做的一些事情 因為 egg 是基於 koa的 所以koa得洋蔥模型也被 egg所採用 1.在egg中建立乙個 middleware 資料夾 2.建立乙個 middlewaredemo....

在Docker中使用mongodb資料庫

sudo docker pull mongosudo docker run p 27017 27017 v tmp db data db d mongosudo docker run it mongo mongo host 宿主機ip位址 port 27017 show dbs admin 0.00...