我正在用 express 和 mongoose/mongodb 构建一个 nodejs 应用程序。
为了管理用户角色(一个用户可能有 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,但实际属性存储在另一个集合中。
所以,这里有问题:
a) 有没有办法从我的用户模式方法中加载角色属性?我尝试在方法内调用填充,但收到用户对象不知道任何填充方法的错误。我还尝试从方法内部执行 Role.findById(),但也出现错误(尝试使用 Role 和 RoleSchema)
b) 如果没有办法……我应该简单地添加代码来签入我的脚本吗?我讨厌不得不将这种逻辑与应用程序逻辑/流混合。有更好的选择吗?
c) 将这些集合分成两部分是不是一个坏主意?我完全错过了 NoSQL 的意义吗?如果角色只是作为用户集合的一部分存储的嵌入文档数组会更好吗?