実際、これを行うための「最良の」方法は、 .aggregate()を使用することです。
および $ lookup
データを「結合」し、一致条件で「フィルタリング」します。 .populate()
MovieModel.aggregate([
{ "$match": { "m_title": m_title } },
{ "$lookup": {
"from": RankMovieModel.collection.name,
"localField": "_id",
"foreignField": "movie",
"as": "rankings"
}}
])
ランキングが「たくさん」ある場合は、<を使用するのが最適です。 code> $ unwind 、関連する「ランキング」アイテムごとにドキュメントを作成します:
MovieModel.aggregate([
{ "$match": { "m_title": m_title } },
{ "$lookup": {
"from": RankMovieModel.collection.name,
"localField": "_id",
"foreignField": "movie",
"as": "rankings"
}},
{ "$unwind": "$rankings" }
])
16MBのBSON制限に違反しないように、MongoDBがドキュメントの「結合」を処理する方法についても特別な処理があります。したがって、実際には、この特別なことは、 $ unwind
>
$ lookup
の直後に続きます
パイプラインステージ:
{
"$lookup" : {
"from" : "rankmovies",
"as" : "rankings",
"localField" : "_id",
"foreignField" : "movie",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
}
}
}
したがって、 $ unwind
実際には「消えて」、代わりに $ lookup
これが「1つの」操作であるかのようにそれ自体。そうすれば、親ドキュメント内に直接「配列」を作成しないため、多くの「関連する」アイテムがある極端な場合にサイズが16MBを超えることになります。
$ lookupをサポートするMongoDBがない場合コード>
(MongoDB3.2最小値 )次に、 .populate()
で「仮想」を使用できます。
代わりに(最低でもMongoose4.5.0が必要です )。ただし、これは実際には「2」を実行することに注意してください サーバーへのクエリ:
まず、「仮想」をスキーマに追加します。
movieSchema.virtual("rankings",{
"ref": "Movie",
"localField": "_id",
"foreignField": "movie"
});
次に、 .populate()
を使用してクエリを発行します。
:
MovieModel.find({ "m_title": m_title })
.populate('rankings')
.exec()