如何访问 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 国家数组。
您可能需要重写参数如下,因为这可能不正确。您可以查看如何定义查询或变异参数 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}}
您需要添加 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".
我在名为 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 国家数组。
您可能需要重写参数如下,因为这可能不正确。您可以查看如何定义查询或变异参数 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}}
您需要添加
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".