使用GraphQL在AWS Amplify上计数项目的最佳方式



堆栈:使用GraphQL(DynamoDB(在AWS Amplify上进行反应

由于非关系数据库不提供SELECT .. COUNT .. FROM ...,所以对我来说,有效地显示应用程序上的项目数量一直是个问题。

当前的实现是手动更新计数。每次用户创建新的帖子时,我都会用单独的调用手动更新帖子计数+1,这些调用将保存在不同的DynamoDB表下。这存在一个问题,即计数+1请求并不总是根据互联网连接状态执行。

另一种选择是在DynamoDB上使用scan运算符,这根本没有效率,因为它需要遍历表中可能有数百万行的所有项。

似乎@searchable指令可以是一个选项,在创建新帖子时可以作为查询调用,执行查询以按用户ID搜索所有帖子并获得总计数。然而,我对这个解决方案不是很熟悉,也不确定性能加上运行成本(因为它需要EC2(

你是如何解决这个问题的?实现这个问题的最佳方法是什么?

  1. DynamoDB没有有效的方法来计数项目,而且它通常不能执行聚合操作。如果要对项进行计数,请编写一个自定义lambda从dynamo表流中读取,并有条件地递增或递减表上的计数器。添加lambda解析程序以从表中读取此计数器值,并将其添加到架构中
  • https://github.com/aws-amplify/amplify-category-api/issues/405
  1. Riccardo几年前写过如何使用计数,你可以在下面的链接上找到他的详细帖子
  • https://www.riccardosirigu.com/blog/aws-amplify-dynamodb-total-count-graphql-queries/

graphQL 上的分页

  • https://docs.amplify.aws/lib/graphqlapi/query-data/q/platform/js/#compound-过滤器
  • https://docs.amplify.aws/cli/graphql/search-and-result-aggregations/#paginate-搜索结果过多

AmplifyCountDirective

AmplifyCountDirective提供了对使用Amplify在DynamoDB表中的项目。

示例此软件包提供@count directive,可用于对模型进行注释。假设我们在以下模式中使用它:

type Foo @count @model {
id: ID!
string_field: String
int_field: Int
float_field: Float
bool_field: Boolean
}

这将编译为:

type Query {
getFoo(id: ID!): Foo
listFoos(filter: ModelFooFilterInput, limit: Int, nextToken: String): ModelFooConnection
countFoo(filter: ModelFooFilterInput): Int
}

最后,您可以使用与列出项目相同的过滤器来查询表中的项目数:

{
countFoo(filter: {
and: {
bool_field: {eq: false},
float_field: {le: 1.5},
string_field: {contains: "bar"}
}
})
}

最新更新