如何排序查询数据与aws-amplify (CRUD的aws-amplify默认)?



我正在请求从带有API的帖子中检索数据,在我的listTodo请求中,我想添加排序数据以根据其创建日期过滤数据以将它们按顺序排列,但由于它是默认的后端aws-amplify,我不知道如何做到这一点。

export const listTodos = /* GraphQL */ `
query ListTodos(
$filter: ModelTodoFilterInput
$limit: Int
$nextToken: String
) {
listTodos(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
title
content
email
coverImage
images
page
language
dateAndLocation
createdAt
updatedAt
}
nextToken
}
}
`;

我已经试过了:

  • 添加设置sortDirection: ASC或sortDirection: DESC
  • 添加设置queryField: "todosByDate", sortKeyFields: ["createdAt"]
  • 许多其他尝试

谁能告诉我如何在这个查询中排序数据,按创建日期排序?

您可以探索以下几种可能性:

全局二级索引:一种选择是在要过滤的部分上创建索引(dynamodb中的全局二级索引)。为此,您必须更新graphql模型。下面的模型将为您提供一个查询,您可以在其中检索基于语言的所有待办事项,并根据createdAt字段对数据进行排序。

type Todo @model {
id: ID!)
title: String
content: String
email: String
coverImage: String
images: String
page: Int
language: String @index(name: "todosByLanguage", queryField: "todosByLanguage", sortKeyFields: ["createdAt"])
dateAndLocation: String
createdAt: AWSDateTime
updatedAt: AWSDateTime
}

然后您将能够执行一个名为TodosByLanguage的查询,您可以在排序方向上传递。这个查询需要输入语言。

为主索引添加排序键:还可以使用排序键扩展原始键(ID字段)。

type Todo @model {
id: ID! @primaryKey(sortKeyFields: ["createdAt"])
title: String
...
}

我以前没有做过这种方法,所以我不确定它到底是如何工作的。但你可以用这个对createdAt字段上的数据进行排序。但是这会改变dynamoDB表的核心行为,例如,在检索单个项目或更新项目时,可能需要传入排序键(createdAt)。因此,在尝试之前,请确保在开发环境中执行此操作。

Elasticsearch/Opensearch最后一个解决方案是在模型中添加@searchable。这将把todo表中的所有数据流式传输到elasticsearch中(只有新数据,现有数据不会自动流式传输)。但是要注意,elasticsearch是在租用的服务器上运行的,并且可能很昂贵(取决于您的预算)。

type Todo @searchable @model {
id: ID!
title: String
...
}

Opensearch在执行查询时比dynamoDB灵活得多。在这里,你可以按你想要的方式搜索和排序几乎所有的东西。

编辑在aws中,Elasticsearch现在被称为Opensearch

最新更新