我正在用express和mongoose/mongodb構建nodejs應用程序。如何使用Mongoose從Schema方法訪問嵌入式文檔(DBRef-like)的屬性?
爲了管理用戶角色(用戶可能有0到n個角色),我決定實現一個用戶模式和一個單獨的角色模式,並將它們綁定在一起,如DBRefs和使用貓鼬填充功能從一個角色到另一個角色其他容易。我選擇了這種結構,因爲我認爲這是回答諸如「給我一個具有X角色的用戶列表」或「給我一個Y角色即將到期的用戶列表」的最佳方式。
這些被剝離下來的角色和用戶模式我的版本:
RoleSchema = new Schema {
_user: { type: Schema.ObjectId, ref: 'User' }
type: String
expiration: { type: Date, default : '0' }
}
UserSchema = new Schema {
email: { type: String, index: { unique: true }}
roles : [{ type: Schema.ObjectId, ref: 'Role' }]
}
有了這個,我可以從我的快遞腳本中創建/讀取/填充用戶和角色沒有問題。當我想向用戶添加角色時,我創建角色並保存,然後將其推送到用戶的角色數組,然後保存用戶。所以,mongoDB會發生什麼,每個模式都有自己的集合,並且它們通過一個id字段指向彼此。
現在,我想下一步要做的就是實現我的模式布爾類型的方法來檢查角色相關的問題,讓我可以做這樣的事情
if(user.isActiveSubscriber())
我認爲我將能夠只需添加一個方法到我的用戶模式,這樣來實現:
UserSchema.method "isActiveSubscriber", ->
result = false
now = new Date()
@roles.forEach (role) ->
result = true if role.type is "SUBSCRIBER" and role.expiration > now
result
我的問題是角色走出來空屬性。我想這是有道理的,因爲我的用戶集合只有角色的id,但實際屬性存儲在另一個集合中。
所以,在這裏走的問題:
一)有沒有辦法來加載角色從我的用戶架構方法中的屬性? 我試着調用方法內部的填充,但得到了一個錯誤,用戶對象不知道任何填充方法。我也嘗試從方法內部做一個Role.findById(),但也得到一個錯誤(嘗試與角色和RoleSchema)
b)萬一沒有辦法...我應該簡單地添加代碼來檢查在我的腳本?我討厭把這種邏輯與應用程序邏輯/流程混合在一起。有更好的選擇嗎?
c)將這些集合分爲兩部分是一個壞主意嗎?我完全錯過了NoSQL的觀點嗎?如果角色只是作爲用戶集合的一部分存儲的嵌入式文檔的數組,那會更好嗎?
非常感謝。會嘗試這個。 –