Apollo GraphQL リゾルバーで使用される親パラメーターと、Mongoose モデルを結合するための MongoDB 集約の $lookup ステージで使用される親パラメーターの比較
P粉543344381
2023-09-02 09:22:26
<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>
最初の手法をお勧めします。これは間違いなくクリーンで、 おそらく 高速です。 RDB の外部キーのインデックスを作成するのと同じように、
author
フィールドのインデックスを必ず作成する必要があります。2 つの方法にはいくつかの違いがあります
パーサーを使用する
このアプローチはより直観的で読みやすいため、特に複雑なクエリの場合、保守が容易であると思います。
ただし、ネストされたフィールドごとにデータベースへの追加呼び出しが行われるため、大量のデータを処理する場合は最も効率的ではない可能性があります。これは、多数の複雑なネストされたクエリを処理する場合、パフォーマンスのボトルネックになる可能性があります。###それが役に立てば幸い:)###