2016-11-29 13 views
0

mongodbコレクションには、parentschildrenとしましょう。この親子のデザインには1対多の関係があり、親に照会するときにも子供が欲しいと思っています。マングース - 親ドキュメント、子ドキュメント、またはその両方に参照を追加する必要がありますか?

var ParentSchema = new Schema({ 
    name: String, 
    children: [{type: Schema.Types.ObjectID, ref: 'Child'}] 
}); 

var ChildSchema = new Schema({ 
    name: String 
}); 

こうすることで、私は簡単に親を持つ子供たちを取得するためにpopulate()を使用することができます。そのロジックにより、それがこのモデルのデザインを持っていることは理にかなっています。しかし、このような配列を使うのはうまくいかないと言われました。オブジェクト参照をChildSchemaに入れると、このような配列の使用を避けることができます。

var ParentSchema = new Schema({ 
    name: String 
}); 

var ChildSchema = new Schema({ 
    name: String, 
    parent: {type: Schema.Types.ObjectID, ref: 'Parent'} 
}); 

しかし、私は再び親と一緒に子どもを取得したい場合、populate()は動作しません。使用するのに最適なパターンは何ですか?私が子供たちのリファレンスを使用している場合は、populate()と同様の方法がありますか? 1つの結果を得るためにクエリを実行する必要はありません。

答えて

4

私の理解では、親の中の子への参照の配列の格納に関する問題は、子の配列が無制限の場合に発生します。これが当てはまらない場合は、Parents内のChildrenへの参照の配列を格納することをお勧めします。子どもの数が非常に多い、または無制限の場合、ドキュメントはバーチャルを使用することを提案しています。

は、私はここ mongoosejs.com Mongoose.jsのドキュメントをチェックアウト...人口の詳細については

` 
var ChildSchema = new Schema({ 
     name: String, 
     parent: String 
}); 

var ParentSchema = new Schema({ 
     name: String 
}); 

ParentSchema.virtual('children', { 
     ref: 'Child', // the model to use 
     localField: 'name', // find children where 'localField' 
     foreignField: 'parent' // is equal to foreignField 
}); 


var Parent = mongoose.model('Parent', parentSchema); 
var Child = mongoose.model('Child', childSchema); 

/* 
Let's say we have two parents: Jack and Mindy 
And four children: Jake with Jack, and Mike, Molly, and Mildred with Mindy 
*/ 

Parent.find({}).populate('children').exec(function(error, parents) { 
/// parents.children is now an array of instances of Child. 
}); 

` 

、簡単な例は次のようになりますと信じています。

私の例としてのmongoosejs.comへのすべてのクレジットは、それらのものの適応です。 また、電話でこの質問に回答しているので、実際にこのコードをテストしていないことに注意してください。

これが役に立ちます。

+0

これはちょうど私が欲しかったと思う、ありがとう!この種のものは本質的にungoogleableです –

+0

私たちは皆がスタックオーバーフローを愛する理由です;)うれしい私は助けることができます。 – quarterpi

関連する問題