Как добавить элементы в список?

Я хотел бы добавить строковое слово в список listOfVideosRated[] в моей таблице пользователей.

Я думаю, вам нужно сначала получить запись, затем обновить запись и нажать. Записи в динамо хранятся как объекты json, я не думаю, что можно изменить ключи объектов, просто замените их. Я могу ошибаться

Seth McClaine 18.07.2019 00:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
4 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы можете опубликовать свой шаблон сопоставления схемы/преобразователя, я могу дать более конкретный совет, но я сделаю все возможное, чтобы ответить на него тем, что вы уже опубликовали.

Простой способ

Если у вас уже есть существующий элемент, один из способов сделать это — обновить существующие пары и передать их в существующую мутацию.

const existingItem = {
  id: "e5eb02ae-04d5-4331-91e6-11efaaf12ea5",
  Pairs: [['a', 'b'],['c', 'd'],['e', 'f']]
}

const newPairs = {
  number1: "g",
  number2: "h"
}

const updateinfo = {
  id: existingItem.id,
  // Note that if existingItem.Pairs is always defined this can be simplified to
  // Pairs: [...existingItem.Pairs, [newPairs.number1, newPairs.number2]]
  Pairs: existingItem.Pairs ?
      [...existingItem.Pairs, [newPairs.number1, newPairs.number2]] : 
      [[newPairs.number1, newPairs.number2]]
}

try {
  await API.graphql(graphqlOperation (UpdateInfo, { input: updateinfo }))  
  //mutation
  console.info('success')
} 
catch (err) {
  console.info(err)
}

Использование функций DynamoDB

Если у вас нет существующего элемента или если Pairs может быть довольно большим, вместо этого можно использовать функцию list_append AWS DynamoDB.

list_append (operand, operand)

This function evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

Вот пример с конкретной мутацией, которая его использует.

### SDL
type Item {
    id: ID!
    Pairs: [[String]]
}

input AddPairInput {
    id: ID!
    number1: String!
    number2: String!
}

type Mutation {
    addPairToItem(input: AddPairInput!): Item!
}

...rest of schema omitted for brevity 

### Resolver Request Mapping Template
{
    "version": "2017-02-28",
    "operation": "UpdateItem",
    "key": {
        "id": { "S": "$ctx.args.input.id"}
    },
    "update": {
        ### Note: we also use if_not_exists here so this works if Pairs is not yet defined on the item.
        "expression":"SET Pairs = list_append(if_not_exists(Pairs, :emptyList), :newPair)",
        "expressionValues": 
          { 
            ":newPair":{"L": [{"L":[{"S":"$ctx.args.input.number1"},
                                    {"S":"$ctx.args.input.number2"}]}]},
            ":emptyList":{"L": []}
          }
        }
}

### Resolver Response Mapping Template
$util.toJson($ctx.result)

Этот способ также удобен, потому что, если кто-то другой обновит Pairs, вы не перезапишете его обновление. Вы также можете добавить новую пару в начало списка, изменив порядок ваших аргументов в функции list_append.

DynamoDB работает с AWS Amplify

Если ваш проект был сгенерирован AWS Amplify, вам нужно будет добавить клиентский решатель.

Шаг 1: Добавьте новую мутацию в вашу схему

### ./amplify/backend/api/<api_name>/schema.graphql
type Item @model {
  id: ID!
  Pairs: [[String]]
}

type Mutation {
  addPairToItem(input: AddPairToItemInput!): Item!
}

input AddPairToItemInput {
  id: ID!
  number1: String!
  number2: String!
}

Шаг 2. Добавьте шаблон сопоставления запросов распознавателя

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.req.vtl
{
    "version": "2017-02-28",
    "operation": "UpdateItem",
    "key": {
        "id": { "S": "$ctx.args.input.id"}
    },
    "update": {
        "expression":"SET Pairs = list_append(if_not_exists(Pairs, :emptyList), :newPair)",
        "expressionValues":
          {
            ":newPair":{"L": [{"L":[{"S":"$ctx.args.input.number1"},{"S":"$ctx.args.input.number2"}]}]},
            ":emptyList":{"L": []}
          }
        }
}

Шаг 3. Добавьте шаблон сопоставления ответов преобразователя.

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.res.vtl
$util.toJson($ctx.result)

Шаг 4. Добавьте свой собственный преобразователь в стек CustomResources.

### ./amplify/backend/api/<api_name>/stacks/CustomResources.json
    "Resources": {
        // ...other resources may exist here
        "AddPairToItemResolver": {
            "Type": "AWS::AppSync::Resolver",
            "Properties": {
                "ApiId": {
                    "Ref": "AppSyncApiId"
                },
                "DataSourceName": "ItemTable",
                "TypeName": "Mutation",
                "FieldName": "addPairToItem",
                "RequestMappingTemplateS3Location": {
                    "Fn::Sub": [
                        "s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/Mutation.addPairToItem.req.vtl",
                        {
                            "S3DeploymentBucket": {
                                "Ref": "S3DeploymentBucket"
                            },
                            "S3DeploymentRootKey": {
                                "Ref": "S3DeploymentRootKey"
                            }
                        }
                    ]
                },
                "ResponseMappingTemplateS3Location": {
                    "Fn::Sub": [
                        "s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/Mutation.addPairToItem.res.vtl",
                        {
                            "S3DeploymentBucket": {
                                "Ref": "S3DeploymentBucket"
                            },
                            "S3DeploymentRootKey": {
                                "Ref": "S3DeploymentRootKey"
                            }
                        }
                    ]
                }
            }
        }
    },

Шаг 5. Создайте и разверните новые изменения

  • Запустите amplify api gql-compile, чтобы увидеть новые изменения в сгенерированном коде (необязательно).
  • Запустите amplify push, чтобы развернуть ваши изменения.

Теперь вы можете либо запустить amplify api console, либо использовать новый сгенерированный код для проверки изменений с вашей новой мутацией.

Чтобы сгенерировать новый код, вы можете запустить amplify codegen. Затем вы сможете сделать что-то вроде этого

import Amplify, { API, graphqlOperation } from "aws-amplify";
import * as mutations from './graphql/mutations';

// Mutation
const addPairToItem = {
    id: '1',
    number1: 'a',
    number2: 'b'
};

const newItem = await API.graphql(graphqlOperation(mutations.addPairToItem, {input: addPairToItem}));

Дополнительные примеры

Не забудьте обновить файл CustomResources.json, указав все новые добавляемые преобразователи.

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

### ./amplify/backend/api/<api_name>/schema.graphql
type Item @model {
    id: ID!
    words: [String]
}

input AddWordInput {
    id: ID!
    word: String!
}

type Mutation {
    addWordToItem(input: AddWordInput!): Item!
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordToItem.req.vtl
{
    "version": "2017-02-28",
    "operation": "UpdateItem",
    "key": {
        "id": { "S": "$ctx.args.input.id"}
    },
    "update": {
        "expression":"SET words = list_append(if_not_exists(words, :emptyList), :newWord)",
        "expressionValues":
          {
            ":newWord":{"L": [{"S":"$ctx.args.input.word"}]},
            ":emptyList":{"L": []}
          }
        }
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordToItem.res.vtl
$util.toJson($ctx.result)


### Usage
import Amplify, { API, graphqlOperation } from "aws-amplify";
import * as mutations from './graphql/mutations';

// Mutation
const newWord = {
    id: '1',
    word: 'foo'
};

const newItem = await API.graphql(graphqlOperation(mutations.addWordToItem, {input: newWord}));

Добавление нескольких элементов в список скалярных значений

Примечание. Я ввожу здесь $util.dynamodb.toDynamoDBJson, чтобы упростить создание нашего VTL. До сих пор я был откровенен, но эта утилита может упростить большую часть работы. Подробнее здесь

### ./amplify/backend/api/<api_name>/schema.graphql
type Item @model {
    id: ID!
    words: [String]
}

input AddWordsInput {
  id: ID!
  words: [String!]!
}

type Mutation {
  addWordsToItem(input: AddWordsInput!): Item!
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordsToItem.req.vtl
{
    "version": "2017-02-28",
    "operation": "UpdateItem",
    "key": {
        "id": { "S": "$ctx.args.input.id"}
    },
    "update": {
        "expression":"SET words = list_append(if_not_exists(words, :emptyList), :newWords)",
        "expressionValues":
          {
            ":newWords": $util.dynamodb.toDynamoDBJson($ctx.args.input.words),
            ":emptyList": $util.dynamodb.toDynamoDBJson([])
          }
        }
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordsToItem.res.vtl
$util.toJson($ctx.result)


### Usage
import Amplify, { API, graphqlOperation } from "aws-amplify";
import * as mutations from './graphql/mutations';

// Mutation
const newWords = {
    id: '1',
    words: ["bar","xyz","bar"]
};

const newItem = await API.graphql(graphqlOperation(mutations.addWordsToItem, {input: newWords}));

Удалить элемент из списка скалярных значений

Удаление элементов из списков в DynamoDB — делается с помощью действия REMOVE. Вы должны указать неотрицательный индекс как часть выражения обновления. Если индекс не существует для элемента, ваш запрос не завершится ошибкой (например, нет исключений индекса за пределами).

type Item @model {
    id: ID!
    words: [String]
}

input RemoveWordInput {
  id: ID!
  wordIndex: Int!
}

type Mutation {
    removeWordFromItem(input: RemoveWordInput!): Item!
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.removeWordFromItem.req.vtl
{
    "version": "2017-02-28",
    "operation": "UpdateItem",
    "key": {
        "id": { "S": "$ctx.args.input.id"}
    },
    "update": {
        "expression":"REMOVE words[$ctx.args.input.wordIndex]"
    }
}

### ./amplify/backend/api/<api_name>/resolvers/Mutation.removeWordFromItem.res.vtl
$util.toJson($ctx.result)


### Usage
import Amplify, { API, graphqlOperation } from "aws-amplify";
import * as mutations from './graphql/mutations';

// Mutation
const removeWord = {
    id: '1',
    // The index is 0 based so wordIndex: 0
    // would delete the first item,
    // wordIndex: 1 deletes the second, etc.
    wordIndex: 1 
};

const newItem = await API.graphql(graphqlOperation(mutations.removeWordFromItem, {input: removeWord}));

@NathanQuinn Как нам удалить? А также как мы можем удалить один элемент из списка? list_append объединяет только два списка, но нет документации о том, как удалить элемент из списка.

Babu 29.07.2019 15:10

@ chai86 Вы имеете в виду просто список скалярных значений? (например, ["а", "б", "в])

Nathan Quinn 03.08.2019 05:01

@Babu Когда вы говорите «удалить», вы имеете в виду полное удаление атрибута из элемента? Я понимаю, что вы имеете в виду, когда спрашиваете об удалении элемента из списка, но хотите понять свой первый вариант использования. Я опубликую несколько дополнительных примеров использования других функций DynamoDB.

Nathan Quinn 03.08.2019 05:07

@ chai86 Я добавил пример добавления в список одиночных скалярных значений и нескольких скалярных значений. Этот ответ становится довольно длинным. Я сделаю репозиторий GitHub, содержащий больше.

Nathan Quinn 03.08.2019 08:55

@NathanQuinn считает, что тип поля dynamodb — «Список», мне нужно удалить из него элемент. Прямо сейчас list_append технически объединяет два списка? Но мне просто нужно реализовать функциональность для добавления и удаления одного скалярного типа. Пожалуйста, поделитесь репозиторием github. Очень ценю и благодарю!!

Babu 03.08.2019 09:57

@Babu Я добавил здесь пример удаления элемента. Я обновлю репозиторий GitHub, когда закончу еще несколько примеров.

Nathan Quinn 03.08.2019 18:48

@NathanQuinn Я очень близок к завершению приложения, над которым работаю (и Amplify оказался действительно полезным). Однако я застрял на этой последней части, чтобы УДАЛИТЬ строку, не могли бы вы срочно помочь !!!! Я обновил исходный пост со всей информацией. Спасибо :)

chai86 02.12.2019 14:51

@NathanQuinn Репозиторий github с примерами, безусловно, ОЧЕНЬ ценится, если у вас есть время, добавление «объекта» в список также является тем, что мне нужно прямо сейчас, например, сообщение типа с идентификатором, автором и содержимым и коллекция типов с [Сообщение]

Purefan 12.12.2019 12:16

Абсолютно фантастический ответ, очень полезный. Хотел бы я проголосовать больше!

tedsmitt 06.02.2020 19:48

Отличный материал, супер полезный ответ, спасибо, что поделились.

beevor 23.05.2020 21:23

как можно добавить пользовательский объект в список?

ninsonTan 16.10.2021 03:49

Другие вопросы по теме