私はexpressとmongoose/mongodbでnodejsアプリケーションを構築しています。Mongooseを使用したスキーマメソッドから埋め込みドキュメント(DBRefのような)の属性にアクセスするには?
ユーザーロール(ユーザーが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)は、私のユーザー・スキーマのメソッド内から属性の役割をロードする方法はありますか? メソッド内でpopulateを呼び出そうとしましたが、ユーザーオブジェクトがpopulateメソッドを知らないというエラーが発生しました。私もメソッド内からRole.findById()を試してみましたが、エラー(RoleとRoleSchemaを試してみました)を受け取りました。
b)方法がない場合は、私のスクリプトで?この種のロジックをアプリケーションロジック/フローと混在させる必要はありません。より良い選択肢がありますか?
c)これらのコレクションを2つに分けるのは悪い考えですか? NoSQLの要点を完全に欠いていますか?ロールが単純にユーザーコレクションの一部として格納された埋め込みドキュメントの配列であれば、それは良いでしょうか?
ありがとうございます。これを試みます。 –