を書くことができます。これで、複数のコレクションから同時にデータを取り込みます。
は、あなたは自分のスキーマのパスに代わりref
のrefPath
属性を使用する必要があります。
var schema = mongoose.Schema({
message: { type: String, required: true },
author: {
type: { type: String, enum: ['user','student'] },
data: { type: ObjectId, refPath: 'author.type' }
},{
timestamps: true
});
したがって、上記のrefPath
プロパティはマングースが決定するためにあなたの会話スキーマにauthor.type
パスを見てみましょうことを意味しています使用するモデル。
だからあなたのクエリでは、あなたがそうのような会話の作成者を取り込むことができます。
Conversation.find({}).populate('author.data').exec(callback);
あなたはdocumentation page for population(下に近い)の詳細情報を見つけてもthis pull requestですることができます。
オルタナティブ:マングースは、ユーザーと学生モデルがある関連する方法に応じて
を弁別、あなたもこれを解決するためにdiscriminatorsを使用することができます。 Discriminatorsはスキーマの継承メカニズムです。基本的には、MongoDBの同じコレクションの上にオーバーラップするスキーマを持つ複数のモデルを持つことができます。
ディスクリミネータを使用すると、最終的に基本スキーマとディスクリミネータスキーマを持つことになります。あなたは、例えばuser
あなたの基本スキーマとstudent
ユーザーの弁別スキーマを作ることができる:
// Define user schema and model
var userSchema = new mongoose.Schema({ name: String });
var User = mongoose.model('User', userSchema);
// Define student schema and discriminate user schema
var studentSchema = new mongoose.Schema({ level: Number });
var Student = User.discriminator('Student', studentSchema);
今すぐあなたの学生モデルが(それはまた、nameプロパティを持つように)、ユーザからのすべてのパスを継承し、同じコレクションにドキュメントを保存します。このため、あなたの参照と問い合わせにも対応します:
// This will find all users including students
User.find({}, callback);
// This will also find conversations no matter if the referenced user is a student or not
Conversation.find({ user: someId }, callback);
@ seyi-adekoyaオプションの1つがあなたのために解決しましたか? – benjiman
どのようにして、refPathソリューションを使用して、たとえばstudentのタイプの新しいユーザーを作成するのですか。 –
.create()を使用して他のモデルと同じように作成します。 User.create()またはStudent.create()を呼び出すと、Collectionの型を "User"または "Student"に設定し、データフィールドにidを設定するだけです。Collection.create({author:{type: '生徒 '、データ:' 5889d7971442b111ec1a93e8 '}})); – benjiman