2016-10-13 7 views
0

ユーザーがイベントに自分自身を追加したり、イベントから自分自身を削除したり、イベントでゲストを招待できるかどうかを指定するイベントリストを作成しようとしています。重複しないで別のモデルを参照するプロパティを更新する

私はイベントスキーマとユーザースキーマを持っています。イベントスキーマはユーザースキーマを参照しています。したがって、新しいイベントが作成されると、ユーザーはIDでイベントを追加できます。

これで、ユーザーにゲストを追加できるようにしようとしています。どのように達成するのですか?

は、ここでの例です

ユーザー・スキーマ:

let UserSchema = new mongoose.Schema({ 
    email: { 
    type: String, 
    lowercase: true, 
    unique: true, 
    required: true 
    }, 
    name:{ 
    type: String, 
    require: true 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
... 

イベントスキーマ:

... 
//In this example the guest will be added but duplicates will occur 
    user:[{ 
    guest: Number, // To make it clear this is not referencing anything it's just a number 
    attending: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
     } 
}] 
:スキーマにrelavant部分を定義する

let EventSchema = new mongoose.Schema({ 
    date: { 
    type: Date, 
    unique: true, 
    timestamps: true, 
    required: true 
    }, 
    title: { 
    type: String, 
    require: true 
    }, 
// Guest property is ignored 
    attending: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    guest: Number, //This is being ingored and never updated 
    ref: 'User' 
    }] 
}) 

第二の方法

上記の設定で、重複を防ぐためにaddToSetで型とゲストのプロパティを更新するにはどうすればよいですか?

Event.findOneAndUpdate({_id:req.body.eventId}, query) 
+0

あなたは任意の例文書を持っていますか? 「ゲスト」フィールドは「出席する」フィールド内に埋め込まれているようですが、意図的なデザインですか? – chridam

+0

はい出席者フィールドを出席者フィールドの下に関連付ける必要があります。これは、ユーザーが出席してゲストを連れて来ることができるイベントリストです。そのため、各イベントには、ユーザーIDとイベントに招待するゲストの数が必要です。 –

+0

DBに永続化したいもののサンプルスニペットを書いておけば便利です。 – Paul

答えて

1

mongooseスキーマがどのように機能するのか分かりませんが、ドキュメントにもっと時間を費やしたいと思うかもしれません。

コードとして提供されているのは、オブジェクトの配列であるEventsというフィールドです。各オブジェクトにはattendingという1つのフィールドがあり、それ自体がObjectIdタイプである必要があります。 'User'コレクションを参照してください。フィールド定義にはguestというプロパティもありますが、これはあなたが求めているものを理解していないため、Mongooseによって無視されます。

このデータ構造が何であるかを理解することは、データの検証と永続化の方法に関するMongooseの指示です。一般に、ほとんどのアプリケーションでは実行時に更新されることはなく、データを直接格納することはありません。また、その目的は、データの格納方法をMongooseに伝えることです。

/**編集コメントに基づいて、私はあなたが直接フィールドの定義に別のフィールドを埋め込むことができない、前に言ったように、質問**/

を更新しました。あなたができることは、両方の情報を持つ混合型を作成することですが、それはある程度自分で管理する必要があります。

let EventSchema = new mongoose.Schema({ 
    date: { 
    type: Date, 
    unique: true, 
    timestamps: true, 
    required: true 
    }, 
    title: { 
    type: String, 
    require: true 
    }, 

    attendees: [{ 
    user : { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    guests : Number 
    }] 
}) 

誰でも参加リストに追加されるときはいつでも、event.markModified()を呼び出して保存する必要があります。重複したユーザーを許可したくない場合は、それも確認する必要があります。起こることを確認する1つの方法は、イベントを取得するときにそのフィールドpopulate()にしてから、ローカルで一致するかどうかを確認するだけです。

/** [編集]#2 **/

あなたはまた、明示的にマングースが見れますモデルを作成するユーザーと#ゲスト情報を「保持」に別のスキーマを作成することができ、あなたが検証を適用することができます彼らには通常のモンゴースの方法で、汚れたチェックは心配しないでください。それは次のようになりたい:

// in ./models/attendee.js 
let AttendeeSchema = new Schema({ 
    user : { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User', 
     unique : true 
     }, 
    guests : Number 
} 

mongoose.model('Attendee', AttendeeSchema); 

// in your Events definition 
    let Attendee = mongoose.model('Attendee'); 
    let EventSchema = new mongoose.Schema({ 
     date: { 
     type: Date, 
     unique: true, 
     timestamps: true, 
     required: true 
     }, 
     title: { 
     type: String, 
     require: true 
     }, 
     attendees: [Attendee] 
    }) 

/**編集3:クエリで今、**/

新しい出席者、与えられた既存のイベントと既知のユーザを挿入するには:

event.attendees.push(new Attendee({user: user, guests: 5})); 
event.save(console.log); 

既存の参加者を更新するには、あなたが最初に探しているものを見つける必要があります:

let attendee = event.attendees.find((attendee) => { return attendee._id.toString() === user._id.toString(); }); 
attendee.guests = 10; 
event.save(console.log); 
+0

私は、私が試したことのいくつかのバリエーションと私が達成しようとしているものの完全な例を含める方が良いと思います。 –

+0

私は物事をクリアするという希望を更新しました。 2番目の方法で示されているようにguestプロパティを使用すると、addToSetはユーザーモデルの重複を追加し、ユーザーは同じイベントの下で多くの時間を含むことができますが、これは望ましくありません。 –

+0

答えがありがとう、私は多分モンゴーズが私のために持ち上げることができる方法があると思った。私は何のためにmarkModified()を必要としますか? –

関連する問題