2017-02-01 1 views
1

問題は、私がConversationモデルのユーザープロパティの代わりに置くことができる2つの異なるスキーマがあることです。メッセージを送信するStudent、またはメッセージを送信するUserとすることができます。学生とユーザーは異なるモデル/スキーマです。会話内の2つの異なるスキーマ間の関係を表示する方法

var mongoose = require('mongoose'); 

    var schema = mongoose.Schema({ 
    message: { type: String, required: true }, 
    user: { type: ObjectId, ref: 'User' /* I want a Student to also be a ref */ } 
    }, { 
    timestamps: true 
    }); 

    var model = mongoose.model('Conversation', schema); 

    module.exports = { model, schema }; 

にはどうすれば良く表すか、またはあなたはマングースに動的参照を使用することができ、このスキーマ/モデル

答えて

1

を書くことができます。これで、複数のコレクションから同時にデータを取り込みます。

は、あなたは自分のスキーマのパスに代わりrefrefPath属性を使用する必要があります。

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); 
+0

@ seyi-adekoyaオプションの1つがあなたのために解決しましたか? – benjiman

+0

どのようにして、refPathソリューションを使用して、たとえばstudentのタイプの新しいユーザーを作成するのですか。 –

+1

.create()を使用して他のモデルと同じように作成します。 User.create()またはStudent.create()を呼び出すと、Collectionの型を "User"または "Student"に設定し、データフィールドにidを設定するだけです。Collection.create({author:{type: '生徒 '、データ:' 5889d7971442b111ec1a93e8 '}})); – benjiman

関連する問題