Вы можете создать вторичный индекс для атрибута slug. Затем вам нужно будет создать еще один запрос GraphQL и соответствующий ему преобразователь, используя операцию запроса DynamoDB. Запрос гораздо более эффективен, чем сканирование.
Для этого у вас есть два варианта. В первом случае вы можете следить за дизайном операции запроса и возвращать список статей вместо одной статьи. Это может быть достигнуто с помощью connectionModels или просто типа, который возвращает список.
Например
## Schema
type ArticleConnection{
items: [Article]
}
type Query {
getArticle(id: ID!): Article
getArticleBySlug(slug: String): ArticleConnection // Query on secundary index
}
## Resolver
## Request Mapping Template
{
"version": "2017-02-28",
"operation": "Query",
"scanIndexForward": true,
"index" : "slug",
"select" : "ALL_ATTRIBUTES",
"query" : {
"expression" : "slug = :slug",
"expressionValues" : {
":slug" : $util.dynamodb.toDynamoDBJson("${ctx.args.slug}")
}
}
}
## Response Mapping Template
$util.toJson($ctx.result)
Или, если вы хотите сохранить соответствие с первым запросом, вы можете сделать следующее
## Schema
type Query {
getArticle(id: ID!): Article
getArticleBySlug(slug: String): Article // Query on secundary index
}
## Resolver
## Request Mapping Template
{
"version": "2017-02-28",
"operation": "Query",
"scanIndexForward": true,
"index" : "slug",
"select" : "ALL_ATTRIBUTES",
"query" : {
"expression" : "slug = :slug",
"expressionValues" : {
":slug" : $util.dynamodb.toDynamoDBJson("${ctx.args.slug}")
}
}
}
## Response Mapping Template
#if($ctx.result.items.size() > 0)
$util.toJson($ctx.result.items[0])
#else
null
#end