查询不会通过 GraphQL 从 DynamoDB 返回某些项目

Posted

技术标签:

【中文标题】查询不会通过 GraphQL 从 DynamoDB 返回某些项目【英文标题】:Query does not return some items from DynamoDB via GraphQL 【发布时间】:2021-09-14 03:26:28 【问题描述】:

请问 GraphQL 无法获取 DynamoDB 中的项目的原因是什么?

通过 DynamoDB 控制台界面搜索时,我可以轻松查看和查询其中的项目,但在 GraphQL 中使用后,有些项目没有显示。请注意,这不是连接问题,因为我可以查询项目,只要有特定项目未返回。

例如,如果我查询所有帖子,它将返回数组中的所有帖子,但该项目没有显示在那里。但是,当我尝试仅通过 ID 定位帖子来查询帖子时,它运行良好。

无效的示例代码:

listPosts(filter: groupID: eq: "25") 
    items 
        id
        content
    

但是当我这样做时,它运行良好:

getPost(id: "c59ce7e9") 
    id
    content

【问题讨论】:

如果它正在提供除一个特定项目之外的其他数据。然后这是发电机数据库方面的问题。可能您可以仔细检查存储在 db 中的该项目的 groupid。可能是某种类型的问题。 【参考方案1】:

我遇到了同样的问题,可以分享我发现并为我工作的内容。

列表操作的默认解析器有一个限制:20 内置。


  "version": "2017-02-28",
  "operation": "Scan",
  "filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
  "limit": $util.defaultIfNull($ctx.args.limit, 20),
  "nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),

我想你可以改变这个,或者你可以像这样向你的查询添加一个限制过滤器:

listPosts(filter: groupID: eq: "25", limit:100) 
    items 
        id
        content
    

限制应该高于记录数。

您可以看到这将是一个问题,因为它正在使用扫描操作,这意味着它会检查每条记录是否匹配。这会损害性能。您可以添加分页,或者您应该为此制作一个查询。您将需要研究分页、关系和连接。

https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html#advanced-relations-and-pagination

【讨论】:

以上是关于查询不会通过 GraphQL 从 DynamoDB 返回某些项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 API 调用中多次使用相同的 GraphQL 查询。放大,DynamoDB

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

具有“自定义类型”属性的DynamoDB表的Graphql Mutation查询

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询

从 DynamoDB 更改中反应应用程序更新数据

调用graphql api时Flutter aws放大不返回数据