machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Сортировка данных в AWSAmplify и DynamoDB с помощью директивы @key

Дата публикации Oct 3, 2019


AWSAmplify с AppSync позволяет нам быстро создавать веб-приложения со встроенной поддержкой API (базы данных), аутентификации и других базовых сервисов, которые нужны большинству приложений.

Во время тестирования с помощью Amplify я застрял на том, как получить данные для возврата в ORDER. Поскольку DynamoDB - это база данных NOSQL, она не поддерживает упорядоченный запрос. Ниже описано, как настроить схему GraphQL, чтобы ваше приложение отображало данные по порядку.

Я полагаю, один простой ответ - отсканировать и загрузить все данные во внешний интерфейс и отсортировать их в браузере. Однако я думаю, что это не практично в долгосрочной перспективе.


Все, что я ищу, так это чтобы записи возвращались в том порядке, в котором они были вставлены. Я думаю, что это не так уж много, чтобы спросить.

Я пропущу все начальные настройки и перейду прямо к schema.graphql. Если вы хотите узнать, как настроить проект AWSAmplify и включить API, ознакомьтесь сВот,


type Incident @model{id: IDlocation: Stringtimestamp: AWSTimestampusername: Stringmessage: String}

Это моя отправная точка. Супер простой тип инцидента.

Запустите [усиливать толчок], чтобы создать экземпляр AppSync и таблицу DynamoDB.

Далее войдите в AWSConsole.

На игровой площадке AppSync создайте 4 записи.

mutation CreateIncident{
createIncident(input: {timestamp:1570120338,
username:"swong", message:"M1"}){
id
}
}
mutation CreateIncident2{
createIncident(input: {timestamp:1570120477,
username:"swong", message:"M2"}){
id
}
}
mutation CreateIncident3{
createIncident(input: {timestamp:1570120479,
username:"swong", message:"M3"}){
id
}
}
mutation CreateIncident4{
createIncident(input: {timestamp:1570120492,
username:"swong", message:"M4"}){
id
}
}

ПРИМЕЧАНИЕ. Мы жестко закодировали метку времени, чтобы эти 4 записи создавались в последовательном порядке.

Теперь давайте перечислим их:

query List{
listIncidents {
items {
id,message
}
}
}

Вывод возвращается из строя:

{
"data": {
"listIncidents": {
"items": [
{
"id": "c0655d42-25fe-4c3c-9c2e-63ecac2f0844",
"message": "M4"
},
{
"id": "6aaa5cb1-6912-4800-a3f8-7a60bdf0198c",
"message": "M2"
},
{
"id": "25f6a406-08b2-45c3-940b-5ef718a08030",
"message": "M1"
},
{
"id": "86d45146-b2e7-4f30-96b6-e059b6fbb2ce",
"message": "M3"
}
]
}
}
}

Если ваш набор данных небольшой, можно предвидеть, что вы можете перечислить весь набор данных и отсортировать их на внешнем интерфейсе. Однако это не практично в реальном мире.


Чтобы решить эту проблему, мы должны использовать Global Secondary Index в DynamoDB и новыйдиректива @key,

Вернитесь к schema.graphql и добавьте директиву @key.

type Incident @model@key(name: "ByUser",fields: ["username", "timestamp"],queryField: "incidentsByUser"){id: IDlocation: Stringtimestamp: AWSTimestampusername: Stringmessage: String}

Здесь мы создаем пользовательский индекс с именем «ByUser».

Требуется 2 поля, имя пользователя - ключ раздела, а метка времени - ключ сортировки. Мы также просим Amplify создать еще один запрос с именем «incidentsByUser» для нас.

Запустите [усиление push] еще раз, чтобы обновить бэкэнд

AppSync создаст Глобальный вторичный индекс (GSI) в вашей DynamoDB. Это будет проходить процесс обратной засыпки для любых существующих данных.

Теперь вернитесь в консоль AppSync и попробуйте снова «listIncidents».

query List{
listIncidents {
items {
id,message
}
}
}{
"data": {
"listIncidents": {
"items": [
{
"id": "c0655d42-25fe-4c3c-9c2e-63ecac2f0844",
"message": "M4"
},
{
"id": "6aaa5cb1-6912-4800-a3f8-7a60bdf0198c",
"message": "M2"
},
{
"id": "25f6a406-08b2-45c3-940b-5ef718a08030",
"message": "M1"
},
{
"id": "86d45146-b2e7-4f30-96b6-e059b6fbb2ce",
"message": "M3"
}
]
}
}
}

О нет. Результат все еще не в порядке.

Откройте раздел «Схема» справа, и вы увидите новый запрос под названием: «incidentsByUser». Мы хотим использовать этот запрос вместо запроса «listIncidents».

query ListByUser{
incidentsByUser(username:"swong"){
items {
id,message
}
}
}{
"data": {
"incidentsByUser": {
"items": [
{
"id": "25f6a406-08b2-45c3-940b-5ef718a08030",
"message": "M1"
},
{
"id": "6aaa5cb1-6912-4800-a3f8-7a60bdf0198c",
"message": "M2"
},
{
"id": "86d45146-b2e7-4f30-96b6-e059b6fbb2ce",
"message": "M3"
},
{
"id": "c0655d42-25fe-4c3c-9c2e-63ecac2f0844",
"message": "M4"
}
]
}
}
}

Воля, данные возвращаются в порядок!

Теперь, скорее всего, у вас будет несколько пользователей, что если у вас есть экран администратора и вы хотите, чтобы данные возвращались для всех пользователей.

Для этого вы захотите поместить все записи в новый общий раздел.

Мы создадим концепцию арендатора, в которой будут жить все пользователи одного и того же клиента.

Снова вернемся к schema.graphql

type Incident @model@key(name:"ByUser", fields:["username","timestamp"],queryField:"incidentsByUser")@key(name:"ByTenant", fields["tenant","timestamp"], queryField:"incidentsByTenant"){id: IDtenant: Stringlocation: Stringtimestamp: AWSTimestampusername: Stringmessage: String}

Запустите [усилить толчок] снова.

Вернитесь в консоль AppSync. Мы хотим добавить поле арендатора ко всем записям:

mutation Update{
updateIncident(input: {id: "25f6a406-08b2-45c3-940b-5ef718a08030", tenant:"customer1"}){
id
}
}
mutation Update2{
updateIncident(input: {id: "6aaa5cb1-6912-4800-a3f8-7a60bdf0198c", tenant:"customer1"}){
id
}
}
mutation Update3{
updateIncident(input: {id: "86d45146-b2e7-4f30-96b6-e059b6fbb2ce", tenant:"customer1"}){
id
}
}
mutation Update4{
updateIncident(input: {id: "c0655d42-25fe-4c3c-9c2e-63ecac2f0844", tenant:"customer1"}){
id
}
}
mutation CreateIncident5{
createIncident(input: {timestamp:1570120476,
username:"swong2", message:"M1.1", tenant:"customer1"}){
id
}
}

Обратите внимание, что мы добавили пятое сообщение с другим именем пользователя, но отметка времени находится между M1 и M2.

Теперь запустите следующий запрос

query ListByTenant{
incidentsByTenant(tenant:"customer1"){
items {
id,message
}
}
}{
"data": {
"incidentsByTenant": {
"items": [
{
"id": "25f6a406-08b2-45c3-940b-5ef718a08030",
"message": "M1"
},
{
"id": "3addf4c3-ee17-45d8-a71b-a64d2b72cdd9",
"message": "M1.1"
},
{
"id": "6aaa5cb1-6912-4800-a3f8-7a60bdf0198c",
"message": "M2"
},
{
"id": "86d45146-b2e7-4f30-96b6-e059b6fbb2ce",
"message": "M3"
},
{
"id": "c0655d42-25fe-4c3c-9c2e-63ecac2f0844",
"message": "M4"
}
]
}
}
}

И записи возвращаются в порядке для всех пользователей.

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map