Apollo GraphQL リゾルバーで使用される親パラメーターと、Mongoose モデルを結合するための MongoDB 集約の $lookup ステージで使用される親パラメーターの比較
<p>Apollo GraphQL と Mongoose を使用してバックエンド アプリケーションを開発しています。 User と Post という 2 つのモデルがあり、これらは 1 対多の関係になります (1 人のユーザーが複数の投稿を持つことができますが、1 つの投稿は 1 人のユーザーに属します)。 </p>
<p>GraphQL スキーマの User フィールドをクエリして、ユーザー ID ごとにユーザーとそのユーザーに属するすべての投稿を取得したいと考えています。また、投稿タイプの作成者フィールドをクエリして、投稿を書いたユーザーを取得したいと考えています。 </p>
<p>MongoDB の異なるコレクションからデータを結合するには、Apollo GraphQL リゾルバーの親パラメーターを使用する方法と、MongoDB 集約の $lookup ステージを使用する方法の 2 つがあることを学びました。 </p>
<p>親パラメータは、親フィールドのパーサーから返された結果を含むオブジェクトです。親パラメーターを使用すると、親フィールドまたは型のデータにアクセスし、それを子のフィールドまたは型に渡すことができます。たとえば、これを使用して、次のようにマングース モデルを結合できます。 </p>
<pre class="brush:php;toolbar:false;">type User {
やった!
名前: 文字列
投稿: [投稿]
}
投稿タイプ {
やった!
タイトル: 文字列
著者: ユーザー
}
タイプ クエリ {
user(id: ID!): ユーザー
}
const リゾルバ = {
ユーザー: {
投稿(親、引数、コンテキスト) {
return context.db.Post.find({ author:parent.id });
}、
}、
};</pre>
<p>$lookup ステージは、同じデータベース内の別のコレクションへの左外部結合を実行する集計パイプライン ステージです。 $lookup ステージを使用すると、複数のコレクションのデータを 1 つの結果セットにマージできます。たとえば、これを使用して次のようにモデルを結合できます。 </p>
<pre class="brush:php;toolbar:false;">db.posts
。集計([
{
$lookup: {
送信者: 「ユーザー」、
localField: "著者"、
外部フィールド: "_id"、
として: 「著者」、
}、
}、
])
.toArray((エラー、投稿) => {
console.log(投稿);
});</pre>
<p>自分のアプリケーションにどれを使用すればよいかわかりません。より効率的で、スケーラブルで、保守可能なオプションを選択したいと思いました。 </p>
<p>Apollo GraphQL リゾルバーで親パラメータを使用する場合と、MongoDB 集約で $lookup ステージを使用して Mongoose モデルに結合する場合の主な違いとトレードオフは何ですか? </p>