如何访问 graphQL 中具有特定属性的所有元素?

How can I access all elements with a particular attribute in graphQL?

我在名为 countryData.json 的文件中有一些 json 数据,结构如下:

{
"info":"success",
"stats":
[{
    "id":"1",
    "name":"USA",
    "type":"WEST"
 },
 //...

我正在使用 graphQL 访问此数据。我使用以下内容在国家模式中创建了一个对象类型:

const CountryType = new GraphQLObjectType({
    name: "Country",
    fields: () => ({
        id: { type: GraphQLID },
        name: { type: GraphQLString },
        type: { type: GraphQLString },
    })
});

我想编写一个查询,使我能够访问此数组中具有特定 "name" 值的所有元素(可以有多个同名)。我写了以下查询,但它只 returns 数组中的第一个匹配项:

const RootQuery = new GraphQLObjectType({
    name:"RootQueryType",
    fields:{
        country: {
            type: CountryType,
            args: { type: { name: GraphQLString } },
            resolve(parent, args){
                return _.find(countryData.stats, {name: args.name});
            }
        }
    }
});

“_”来自const _ = require('lodash');

此外,我怎样才能获取数组中的每一项?

我没有重新创建代码,因此我无法检查它是否会正确执行。这是代码,在我看来应该可以工作(无需尝试)。如果你想要 return 个元素数组,你需要实现 https://lodash.com/docs/#filter。过滤器将 return 来自统计信息的所有对象,这些对象与参数名称相匹配。这将 return 正确地包含在解析器函数中,但是,您的架构需要进行调整才能 return 国家数组。

  1. 您可能需要重写参数如下,因为这可能不正确。您可以查看如何定义查询或变异参数 https://github.com/atherosai/express-graphql-demo/blob/feature/2-json-as-an-argument-for-graphql-mutations-and-queries/server/graphql/users/userMutations.js。我会按如下方式重写它以具有参数 "name"

    参数:{名称:{类型:GraphQLString}}

  2. 您需要添加 GraphQLList 修饰符,它定义了您希望从此查询中获取 return CountryTypes 数组。正确的代码应该是这样的

    const RootQuery = new GraphQLObjectType({
      name:"RootQueryType",
      fields:{
        country: {
            type: CountryType,
            args: { name: { type: GraphQLString } },
            resolve(parent, args){
                return _.find(countryData.stats, {name: args.name});
            }
        },
        countries: {
            type: new GraphQLList(CountryType),
            args: { name: { type: GraphQLString } },
            resolve(parent, args){
                return _.filter(countryData.stats, {name: args.name});
            }
        }
      }
    });
    

现在,如果您调用查询国家/地区,您应该能够检索到您所期望的内容。我希望它有所帮助。如果您需要进一步的解释,我写了一篇关于在 GraphQL 模式中实现 lists/arrays 的文章,因为我看到很多人都在为类似的问题而苦苦挣扎。你可以在这里查看 https://graphqlmastery.com/blog/graphql-list-how-to-use-arrays-in-graphql-schema

编辑:至于问题"how to retrieve every object"。您可以通过某种方式修改解析器函数中的代码,如果未指定名称参数,则根本不会过滤国家/地区。这样你就可以在单个查询中同时处理这两种情况 "countries".