2017-01-06 11 views
6

私はそれが簡単なことだと確信していますが、私はGraphQLの文書またはGraphcoolで何も見つけることができませんでした。GraphQL:配列内のデータをフィルタリングする

は(私は、スキーマ表現でミスをした場合は申し訳ありません新しいGraphQLユーザー、)私はこのスキーマでエンティティを持っていると言う:

Book { 
    name: String! 
    author: String! 
    categories: [String!] 
} 

私は"mystery"の一部であるすべての書籍のためのクエリをどのように行うだろうカテゴリー?私はallBooks(filter: {})でフィルタリングできますが、categories_in: ["mystery"]categories_contains: "mystery"はそのトリックをしませんでした。

+1

これは現在ありませんがGraphcoolでサポートされています。たとえば

は、与えられたリストの少なくとも一つのカテゴリに割り当てられ本を照会します。私はこれを追跡する機能リクエストを追加しました:https://github.com/graphcool/feature-requests/issues/60 – sorenbs

+0

これは知っておきたいことです。私はあなたの問題を+1します。すぐにこれを手に入れることができるようにしましょう! – gCardinal

+2

現在の回避策は、 'Book'に多対多の関係を持つ新しいモデル' Category'を導入することかもしれません。次に、あなたはこれを行うことができます: 'allCategories(フィルタ:{tag:" mystery "}){books {id}}'。私は、 'Category'モデルを将来のメタデータなどのために有利にすることができると思います。 – marktani

答えて

9

Categoryモデル

Categoryモデルを作成、この状況についてもう少し考えることは間違いなく行く方法です。

たとえば、読者がお気に入りのカテゴリに後で登録できるようにしたいとします。または、既存のすべてのカテゴリのリストが必要な場合はどうなりますか?文字列リストを使用すると、すべての書籍を照会し、取得したすべてのカテゴリーを後処理する必要があります。文字列リストを使用するのではなく、モデルレベルでこれを処理する方がずっと自然です。

代わりに、新しいCategoryモデルを作成し、CategoryBookの間に多対多の関係を追加できます。このような状況では、一意の列挙型フィールドtagと文字列フィールドtextを追加したいと思います。 (ユニークな文字列フィールドtagだけでも適切でしょう、おそらく味の問題です。)

この設定を使用すると、簡単にブックは、特定のカテゴリに割り当てられている

のようなデータの要件を満たすことができますか?本は与えられたリストのうちの少なくとも一つのカテゴリに割り当てられている

query { 
    # query books by unique category tag 
    Category(tag: MYSTERY) { 
    books { 
     id 
    } 
    } 
    # query books by specific category text 
    Category(filter: { 
    text: "mystery" 
    }) { 
    books { 
     id 
    } 
    } 
} 

?本は与えられたリストのすべてのカテゴリに割り当てられている

query { 
    allCategories(filter: { 
    OR: [{ 
     tag: MYSTERY 
    }, { 
     tag: MAGIC 
    }] 
    }) { 
    books { 
     id 
    } 
    } 
} 

query { 
    allCategories(filter: { 
    AND: [{ 
     tag: MYSTERY 
    }, { 
     tag: MAGIC 
    }] 
    }) { 
    books { 
     id 
    } 
    } 
} 

関連フィルター上のクエリは、指定されたデータの要件を満たしていても

、書籍は、私たちは、クライアント上のグループをフラット化しなければならないことを意味し、対応してCategoryによってグループ化されています。

関連するフィルタを使用すると、関連するカテゴリを定義した条件に基づいて書籍を取得することができます。

query { 
    allBooks(filter: { 
    OR: [{ 
     categories_some: { 
     tag: MYSTERY 
     }, 
     categories_some: { 
     tag: MAGIC 
     } 
    }] 
    }) { 
    id 
    } 
} 
0

ホストされているGraphQLサービスを使用したい場合は、scaphold.ioにしばらくの間この機能がありました。 APIのすべての接続フィールドには、実際にデータを掘り下げるフィルタを公開するWhereArgs引数が付いています。このようなスカラーのリストがある場合、WhereArgsにはcontains & notContainsフィールドが含まれており、リスト内の値に基づいて結果をフィルタリングできます。これにより、このようなクエリを作成することができます。

query MysteriousBooks($where:BookWhereArgs) { 
    viewer { 
    allBooks(where:$where) { 
     edges { node { title, ... } } 
    } 
    } 
} 

# Variables 
{ 
    "where": { 
    "categories": { 
     "contains": "mystery" 
    } 
    } 
} 

スカラーリストでフィルタリングすることなく、この作業を行うにはわずかなスキーマの再調整が必要です。たとえば、Categoryをノードを実装するノードにして、CategoryBookの間の接続を作成することができます。この方法は、あなたはまた、書籍の詳細フィルタリングを行うことができるだろう、あなたのスキーマを構築した場合

query MysteriousBooks($where: CategoryWhereArgs) { 
    viewer { 
    allCategories(where: $where) { 
     books { 
     edges { node { title, ... } } 
     } 
    } 
    } 
} 

# Variables 
{ 
    "where": { 
    "name": { 
     "eq": "mystery" 
    } 
    } 
} 

Bookはそう多くのカテゴリを持っていませんが、これは、あなたがこのようなクエリを発行することが可能になりますアーカイブのすべての本をループする必要はありません。例えば。あなたは効率的に "昨年書き込まれたすべての謎の本"を求めることができます。

全開示:私はScapholdに勤務していますが、切り替えをしなければ苦労することはありません。私はGraphQLを試してみたい人を見て嬉しく思っています。自分のサーバーでこの種の動作を実装する方法が不思議であれば教えてください。

こちらがお役に立てば幸いです。

関連する問題