UpdateItem - Amazon AppSync GraphQL
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

UpdateItem

UpdateItem请求允许您告诉 D Amazon AppSync ynamoDB 函数向 DynamoDB 发出UpdateItem请求,并允许您指定以下内容:

  • DynamoDB 中的项目的键

  • 描述如何更新 DynamoDB 中的项目的更新表达式

  • 操作成功执行的条件

UpdateItem 请求具有以下结构:

type DynamoDBUpdateItemRequest = { operation: 'UpdateItem'; key: { [key: string]: any }; update: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };

字段定义如下:

UpdateItem 字段

operation

要执行的 DynamoDB 操作。要执行 UpdateItem DynamoDB 操作,该字段必须设置为 UpdateItem。该值为必填项。

key

DynamoDB 中的项目的键。DynamoDB 项目可能具有单个哈希键,也可能具有哈希键和排序键,具体取决于表结构。有关指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该值为必填项。

update

update 部分用于指定一个更新表达式,以描述如何更新 DynamoDB 中的项目。有关如何编写更新表达式的更多信息,请参阅 DynamoDB 文档 UpdateExpressions 。此部分是必需的。

update 部分有三个组成部分:

expression

更新表达式。该值为必填项。

expressionNames

以键值对形式替换表达式属性名称 占位符。键对应于 expression 中使用的名称占位符,值必须是与 DynamoDB 中的项目的属性名称对应的字符串。该字段是可选的,只应填充 expression 中使用的表达式属性名称占位符的替换内容。

expressionValues

以键值对形式替换表达式属性 占位符。键对应于 expression 中使用的值占位符,而值必须为类型化值。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。必须指定此值。该字段是可选的,只应填充 expression 中使用的表达式属性值占位符的替换内容。

condition

根据 DynamoDB 中已有的对象状态,确定请求是否应成功的条件。如果未指定条件,则 UpdateItem 请求将更新现有条目,而不考虑其当前状态。有关条件的更多信息,请参阅条件表达式。该值为可选项。

_version

表示项目的最新已知版本的数值。该值为可选项。该字段用于冲突检测,仅受版本控制的数据来源支持。

customPartitionKey

启用后,此字符串值将修改启用版本控制后增量同步表使用的ds_skds_pk记录的格式(有关更多信息,请参阅《Amazon AppSync 开发人员指南》中的冲突检测和同步)。如果启用,还会启用 populateIndexFields 条目处理。该字段是可选的。

populateIndexFields

一个布尔值,在customPartitionKey 一起启用时,它为增量同步表中的每个记录创建新条目,具体来说是在 gsi_ds_pkgsi_ds_sk 列中创建新条目。有关更多信息,请参阅《Amazon AppSync 开发人员指南》中的冲突检测和同步该字段是可选的。

在 DynamoDB 中更新的项目自动转换为 GraphQL 和 JSON 基元类型,并在上下文结果 (context.result) 中提供。

有关 DynamoDB 类型转换的更多信息,请参阅类型系统(响应映射)

有关 JavaScript 解析器的更多信息,请参阅解析JavaScript 器概述。

示例 1

以下示例是 GraphQL 变更 upvote(id: ID!) 的函数请求处理程序。

在该示例中,DynamoDB 中的项目的 upvotesversion 字段递增 1。

import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id } = ctx.args; return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: 'ADD #votefield :plusOne, version :plusOne', expressionNames: { '#votefield': 'upvotes' }, expressionValues: { ':plusOne': { N: 1 } }, }, }; }

示例 2

以下示例是 GraphQL 变更 updateItem(id: ID!, title: String, author: String, expectedVersion: Int!) 的函数请求处理程序。

这是一个复杂的示例,用于检查参数并动态生成更新表达式,此表达式仅包含由客户端提供的参数。例如,如果省略了 titleauthor,则不会更新它们。如果指定了一个参数,但该参数的值为 null,则会从 DynamoDB 上的对象中删除该字段。最后,该操作具有一个条件,用于验证目前位于 DynamoDB 中的项目的 version 字段是否设置为 expectedVersion

import { util } from '@aws-appsync/utils'; export function request(ctx) { const { args: { input: { id, ...values } } } = ctx; const condition = { id: { attributeExists: true }, version: { eq: values.expectedVersion }, }; values.expectedVersion += 1; return dynamodbUpdateRequest({ keys: { id }, values, condition }); } /** * Helper function to update an item * @returns an UpdateItem request */ function dynamodbUpdateRequest(params) { const { keys, values, condition: inCondObj } = params; const sets = []; const removes = []; const expressionNames = {}; const expValues = {}; // Iterate through the keys of the values for (const [key, value] of Object.entries(values)) { expressionNames[`#${key}`] = key; if (value) { sets.push(`#${key} = :${key}`); expValues[`:${key}`] = value; } else { removes.push(`#${key}`); } } let expression = sets.length ? `SET ${sets.join(', ')}` : ''; expression += removes.length ? ` REMOVE ${removes.join(', ')}` : ''; const condition = JSON.parse( util.transform.toDynamoDBConditionExpression(inCondObj) ); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues(keys), condition, update: { expression, expressionNames, expressionValues: util.dynamodb.toMapValues(expValues), }, }; }

有关 DynamoDB UpdateItem API 的更多信息,请参阅 DynamoDB API 文档