2017-07-09 3 views
0

NodeJSとMongooseを使用して、既に実稼働中のREST APIと一緒に行くためにGraphqlサービスを構築し始めていますが、 mongooseスキーマをGraphQL型に変換します。サブフィールドを持つmongooseスキーマからGraphql Typeを生成

私は、次のスキーマがありますので、

var userSchema = new mongoose.Schema({ 
    name: {type: String, required: true}, 
    email: {type: String}, 
    imageURL: {type: String, default:null}, 
    providerId: {type: String, required: true}, 
    token: {type: String, required: true}, 
    history: [{ 
     orders:[{type: mongoose.Types.ObjectId, ref:'Order'}], 
     restaurant: {type: mongoose.Types.ObjectId, ref: 'Restaurant'} 
    }] 
}, { timestamps: true}); 

は、基本的には、トラブルがhistoryフィールドです。このフィールドは、orders(別のマングーススキーマを参照するオブジェクトのリスト)とrestaurant(レストランのマングーススキーマを参照する)の2つのサブフィールドを持つオブジェクトのリストです。

私の主な質問は:historyフィールドでmongooseで行ったように、 "User"に対応するGraphQLタイプを書くときにサブフィールドを作成する方法があるのか​​、それとも2番目のタイプを作成してからこれを参照する必要があります(GraphQLで作成するだけで、アプリケーションが他のスキーマをmongooseで作成する必要はないことを知っています)。

答えて

1

あなたが言ったように、あなたのGraphQLスキーマを書くとき、履歴はおそらくOrderとRestaurantのように別のタイプである必要があります。アポロを使用して、スキーマ型の定義のようなものになります。上記のタイプの定義に加えて

type User { 
    # additional fields 
    history: [Record!]! 
} 

type Record { 
    orders: [Order!]! 
    restaurant: Restaurant 
} 

を、あなたはまた、ユーザーのためのレゾルバを提供することになります。この場合、リゾルバは単にUser.findOne()を返します(または通常はデータベースからUserオブジェクトを取得します)。

ここではちょっとしたことがあります:注文、レストラン、または歴史のためのリゾルバーは必要ないかもしれません。レゾルバを指定しない場合、GraphQLは渡されたオブジェクトをうまく使用するデフォルトのリゾルバを使用します(Userタイプのリゾルバで渡すUserオブジェクトのチャンク)。 GraphQLスキーマの 型定義で指定されたフィールドに一致するキーがオブジェクト内に見つかると、そのフィールドにデータが入力され、その他のフィールドは無視されます。

もちろん、追加の制御が必要な場合(オブジェクトキーとフィールド名が一致しない場合もあります)、常にリゾルバを書き込むことができます。

+0

私はモングースにいなかったので、歴史のために別のタイプを作る必要があるのか​​どうか疑いがありました。だから私はそれをします。説明をありがとう –

+0

@ThiagoNascimentoあなたは[JSONカスタムスカラー](https://github.com/taion/graphql-type-json)を代わりに使うことができますが、次に要求できるものを厳しく制限しています。フィールドを要求する人は、それをレストランだけに限定することはできず、各注文のいくつかのフィールドだけを絞り込むこともできません)。また、履歴内の個々のフィールドを簡単にスタブまたはモックする機能も失われます。 –

+0

それはわかりませんでしたが、私はおそらく別々のタイプになっていますので、要求に柔軟性を持たせることができます –

関連する問題