堆栈:使用GraphQL(DynamoDB(在AWS Amplify上进行反应
由于非关系数据库不提供SELECT .. COUNT .. FROM ...
,所以对我来说,有效地显示应用程序上的项目数量一直是个问题。
当前的实现是手动更新计数。每次用户创建新的帖子时,我都会用单独的调用手动更新帖子计数+1,这些调用将保存在不同的DynamoDB表下。这存在一个问题,即计数+1请求并不总是根据互联网连接状态执行。
另一种选择是在DynamoDB上使用scan
运算符,这根本没有效率,因为它需要遍历表中可能有数百万行的所有项。
似乎@searchable
指令可以是一个选项,在创建新帖子时可以作为查询调用,执行查询以按用户ID搜索所有帖子并获得总计数。然而,我对这个解决方案不是很熟悉,也不确定性能加上运行成本(因为它需要EC2(
你是如何解决这个问题的?实现这个问题的最佳方法是什么?
- DynamoDB没有有效的方法来计数项目,而且它通常不能执行聚合操作。如果要对项进行计数,请编写一个自定义lambda从dynamo表流中读取,并有条件地递增或递减表上的计数器。添加lambda解析程序以从表中读取此计数器值,并将其添加到架构中
- https://github.com/aws-amplify/amplify-category-api/issues/405
- 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"}
}
})
}