2016-03-31 2 views
1

尋ねられたときにのみ、graphqlでディープネストされたオブジェクトをフェッチするにはどうすればよいでしょうか。 私はパフォーマンスが賢明GraphQLでディープネストされたドキュメントを取得する

次のmongo /マングーススキーマを考えてみましょうここを話している:

User 
    | 
    |_ Name 
    | 
    |_ Friends (RefId into User) 
     | 
     |_ User 
      | 
      |_ Friends (RefId into User) 

     ..... 

は、各ユーザーが順番に他の多くの友人を持っている多くの友人、 方法があるとしどれくらい深くあなたがpopulateresolveの機能の中に必要なのか決定するでしょうか?

"just populating"という単純な方法は、クエリの多くが0レベルにあるnameフィールドを選択するだけで、データベースの1/2を占有する可能性があるため、有害な可能性があります。

ありがとうございます。

+1

理由だけではなく、親のユーザーさんの友達フィールド内で見つかったユーザーを返しませんか?特定の深さに友人の友人を熱心に積み重ねようとしていますか?そうであれば、すでに他の友人の友人である友人の友人には注意する必要があります。そのため、無限ループはありません。 –

+0

@BrendanTurner私がここで作ろうとしているのは、「周期的なループ」ではなく、動的にどのくらい深く取り込むべきかを動的に決定する方法です。 ジョブフィールドを持つ友人を持つユーザー。クエリの中には第3レベルの入れ子にする必要があるものもありますが、名前を取得するだけのものもあります。 –

+0

右のように、クエリで指定します。ここでは明確にする必要がある要点があります:https://gist.github.com/xpepermint/7376b8c67caa926e19d2 –

答えて

1

GraphQLクライアントは、ネストされたデータをどれだけ深く指定するか、つまり、クライアントがユーザーの友人を尋ねるときにパラメータを渡すようにすることをお勧めします。 graphql NPMパッケージを使用して

は、実装は以下のようになります。

const UserType = new GraphQLObjectType({ 
    name: 'NestedUser', 
    fields: { 
    ... 
    ... 
    friends: { 
     type: new GraphQLList(UserType), 
     args: { 
     level: { 
      type: GraphQLInt, 
      defaultValue: 0, 
     }, 
     ...connectionArgs, 
     }, 
     resolve: (user, {level, ...args}) => { 
     // Populate nestedFriends according to the level 
     return nestedFriends; 
     }, 
    }, 
    }, 
}); 
+0

その面白いアプローチ、ありがとう。 明示的に深さを記述することなく、フィールドに応じてmongoクエリを操作できるかどうか疑問です –