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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы можете опубликовать свой шаблон сопоставления схемы/преобразователя, я могу дать более конкретный совет, но я сделаю все возможное, чтобы ответить на него тем, что вы уже опубликовали.
Если у вас уже есть существующий элемент, один из способов сделать это — обновить существующие пары и передать их в существующую мутацию.
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)
}
Если у вас нет существующего элемента или если 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.
Если ваш проект был сгенерирован AWS Amplify, вам нужно будет добавить клиентский решатель.
### ./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!
}
### ./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": []}
}
}
}
### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.res.vtl
$util.toJson($ctx.result)
### ./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"
}
}
]
}
}
}
},
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 объединяет только два списка, но нет документации о том, как удалить элемент из списка.
@ chai86 Вы имеете в виду просто список скалярных значений? (например, ["а", "б", "в])
@Babu Когда вы говорите «удалить», вы имеете в виду полное удаление атрибута из элемента? Я понимаю, что вы имеете в виду, когда спрашиваете об удалении элемента из списка, но хотите понять свой первый вариант использования. Я опубликую несколько дополнительных примеров использования других функций DynamoDB.
@ chai86 Я добавил пример добавления в список одиночных скалярных значений и нескольких скалярных значений. Этот ответ становится довольно длинным. Я сделаю репозиторий GitHub, содержащий больше.
@NathanQuinn считает, что тип поля dynamodb — «Список», мне нужно удалить из него элемент. Прямо сейчас list_append технически объединяет два списка? Но мне просто нужно реализовать функциональность для добавления и удаления одного скалярного типа. Пожалуйста, поделитесь репозиторием github. Очень ценю и благодарю!!
@Babu Я добавил здесь пример удаления элемента. Я обновлю репозиторий GitHub, когда закончу еще несколько примеров.
@NathanQuinn Я очень близок к завершению приложения, над которым работаю (и Amplify оказался действительно полезным). Однако я застрял на этой последней части, чтобы УДАЛИТЬ строку, не могли бы вы срочно помочь !!!! Я обновил исходный пост со всей информацией. Спасибо :)
@NathanQuinn Репозиторий github с примерами, безусловно, ОЧЕНЬ ценится, если у вас есть время, добавление «объекта» в список также является тем, что мне нужно прямо сейчас, например, сообщение типа с идентификатором, автором и содержимым и коллекция типов с [Сообщение]
Абсолютно фантастический ответ, очень полезный. Хотел бы я проголосовать больше!
Отличный материал, супер полезный ответ, спасибо, что поделились.
как можно добавить пользовательский объект в список?
Я думаю, вам нужно сначала получить запись, затем обновить запись и нажать. Записи в динамо хранятся как объекты json, я не думаю, что можно изменить ключи объектов, просто замените их. Я могу ошибаться