2016-03-31 2 views
1

Was wäre der beste Ansatz, um tief geschachtelte Objekte mit graphql nur zu holen, wenn Sie dazu aufgefordert werden. Ich spreche hier Leistung klugAbrufen von tief verschachtelten Dokumenten mit GraphQL

Lassen Sie uns sagen Sie folgende Mongo/Mungo Schema haben:

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

     ..... 

nehme jeder Benutzer viele Freunde, die viele andere Freunde haben wiederum hat, wie würde entscheiden, wie tief Sie benötigen populate innerhalb einer resolve Funktion?

Die naive Methode "nur auffüllen" kann schädlich sein, da viele der Abfragen nur das Feld name auf der 0-Ebene auswählen, aber am Ende die Hälfte der db belegen.

Vielen Dank im Voraus.

+1

Warum nicht einfach die Benutzer innerhalb der Freunde Feld Mutter Benutzers gefunden zurückkehren? Versuchen Sie speziell, Freunde von Freunden auf eine bestimmte Tiefe zu laden? Wenn dies der Fall ist, müssen Sie sich vor Freunden von Freunden in Acht nehmen, die bereits Freunde anderer Freunde sind, so dass Sie keine Endlosschleife haben. –

+0

@BrendanTurner der Punkt, den ich versuche, hier zu machen, ist nicht die "zyklischen Schleifen", sondern wie wir dynamisch entscheiden, wie tief sollten wir bevölkern. wenn es Ihnen hilft, können Sie das Beispiel mit Benutzer, der Freunde hat, die ein Jobfeld haben . Jetzt müssen einige der Abfragen die Verschachtelung der 3. Ebene auffüllen, aber einige greifen nur den Namen. –

+0

Richtig, geben Sie das in der Abfrage an. Hier ist ein Kern, der helfen sollte, zu klären: https://gist.github.com/xpepermint/7376b8c67caa926e19d2 –

Antwort

1

Der beste Weg besteht darin, dass der GraphQL-Client angibt, wie tief verschachtelte Daten gewünscht werden, d. H. Der Client muss einen Parameter übergeben, wenn er nach Freunden eines Benutzers fragt.

Mit graphql npm Paket sieht die Umsetzung wie folgt:

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

das ist und interessanter Ansatz, danke. Ich frage mich, ob wir die Mongo-Abfrage entsprechend den Feldern manipulieren können, ohne die Tiefe explizit zu erwähnen –