expressとmongoose/mongodbを使用してnodejsアプリを構築しています。
ユーザーの役割(ユーザーは0からnの役割を持つ場合があります)を管理するために、ユーザースキーマと個別の役割スキーマを実装し、DBRefのようにそれらを結び付け、マングースの入力機能を使用して一方から他方に簡単に移動することにしました。この構造を選択したのは、「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)ユーザースキーマメソッド内からロール属性をロードする方法はありますか?メソッド内でpopulateを呼び出そうとしましたが、ユーザーオブジェクトがpopulateメソッドを認識していないというエラーが発生しました。また、メソッド内からRole.findById()を実行しようとしましたが、エラーが発生しました(RoleとRoleSchemaで試行)
b)方法がない場合...スクリプトをチェックインするためのコードを追加するだけでよいですか?この種のロジックをアプリケーションロジック/フローと混合する必要はありません。より良いオプションはありますか?
c)これらのコレクションを2つに分けるのは悪い考えでしたか?NoSQLのポイントを完全に見逃していますか?ロールがユーザーコレクションの一部として保存された埋め込みドキュメントの配列であるとしたら、もっと良いでしょうか?