如何在AWS DynamoDB AppSync解析器中编写Upsert变异查询插入或更新

问题描述

我正在借助AppSync GraphQL查询来处理DynamoDB。

我有一个DynamoDB表,其中用户名是分区键(哈希键),而timestamp_value是排序键(范围键)。

我要针对一项保存两项内容,即一项正在阅读,而第二项是活动(例如运动,体育等)。要添加这两项,我们有不同之处UI屏幕。两者可能都具有相同的时间戳,因此将保存为一项。

所以现在我需要一个upsert(插入或更新)查询,该查询可用于以上两个操作,因为当您尝试插入新读数时,它将检查是否存在该项。如果存在,它将更新或不更新,然后它将插入项目,并且当用户想要添加新活动时必须进行相同的操作。

我对文档感到困惑,我没有找到执行Upsert操作的确切AppSync请求映射解析器。

以下是PutItem请求映射解析器:-

    {
      "version": "2017-02-28","operation": "PutItem","key": {
         "username": $util.dynamodb.toDynamoDBJson($ctx.identity.username),"timestamp": $util.dynamodb.toDynamoDBJson($ctx.args.input.timestamp),},"attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),"condition": {
         "expression": "attribute_not_exists(#timestamp)","expressionNames": {
           "#timestamp": "timestamp",}

下面是UpdateItem请求映射解析器:-

{
  "version": "2017-02-28","operation": "UpdateItem","key": {
    "username": $util.dynamodb.toDynamoDBJson($ctx.identity.username),## Set up some space to keep track of things we're updating **
  #set( $expNames  = {} )
  #set( $expValues = {} )
  #set( $expSet = {} )
  #set( $expAdd = {} )
  #set( $expRemove = [] )

  ## Iterate through each argument,skipping keys **
  #foreach( $entry in $util.map.copyAndRemoveAllKeys($ctx.args.input,["username","timestamp"]).entrySet() )
    #if( $util.isNull($entry.value) )
      ## If the argument is set to "null",then remove that attribute from the item in DynamoDB **

      #set( $discard = ${expRemove.add("#${entry.key}")} )
      $!{expNames.put("#${entry.key}","${entry.key}")}
    #else
      ## Otherwise set (or update) the attribute on the item in DynamoDB **

      $!{expSet.put("#${entry.key}",":${entry.key}")}
      $!{expNames.put("#${entry.key}","${entry.key}")}
      $!{expValues.put(":${entry.key}",$util.dynamodb.toDynamoDB($entry.value))}
    #end
  #end

  ## Start building the update expression,starting with attributes we're going to SET **
  #set( $expression = "" )
  #if( !${expSet.isEmpty()} )
    #set( $expression = "SET" )
    #foreach( $entry in $expSet.entrySet() )
      #set( $expression = "${expression} ${entry.key} = ${entry.value}" )
      #if ( $foreach.hasNext )
        #set( $expression = "${expression}," )
      #end
    #end
  #end

  ## Continue building the update expression,adding attributes we're going to ADD **
  #if( !${expAdd.isEmpty()} )
    #set( $expression = "${expression} ADD" )
    #foreach( $entry in $expAdd.entrySet() )
      #set( $expression = "${expression} ${entry.key} ${entry.value}" )
      #if ( $foreach.hasNext )
        #set( $expression = "${expression},adding attributes we're going to REMOVE **
  #if( !${expRemove.isEmpty()} )
    #set( $expression = "${expression} REMOVE" )

    #foreach( $entry in $expRemove )
      #set( $expression = "${expression} ${entry}" )
      #if ( $foreach.hasNext )
        #set( $expression = "${expression}," )
      #end
    #end
  #end

  ## Finally,write the update expression into the document,along with any expressionNames and expressionValues **
  "update": {
    "expression": "${expression}",#if( !${expNames.isEmpty()} )
      "expressionNames": $utils.toJson($expNames),#end
    #if( !${expValues.isEmpty()} )
      "expressionValues": $utils.toJson($expValues),#end
  },"condition": {
    "expression": "SET attribute_exists(#username) AND attribute_not_exists(#timestamp)","expressionNames": {
      "#username": "username","#timestamp": "timestamp",}
}

那我该如何更新解析器,以便可以进行upsert操作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...