当前位置: 首页 > 知识库问答 >
问题:

创建或更新dynamodb

唐高卓
2023-03-14

目前,我正在用一个查询检查该项是否存在,然后使用put或updateItem,我想更改它并对DDB进行一次调用。我想进行一个将更新或创建项目的查询。

下面是我的项目的一个例子:

{
   id: 'dsfadsf'
   fa: { "apple" : { "S" : "76-100" }, "yolo" : { "S" : "0-25" }
   pa: { "finish" : { "BOOL" : false },    "userKey" : { "S" : "3e299e12-9e66" }  }
   createdAt: 32432432423
}

项目类型:

createdAt - Number
fa - Map
pa - Map
id - String
finish - Boolean
key - String

如果项目存在,我想推送一个新项目,比如{papa:'dsfadsf'}(永远不要修改fa映射内的现有项目),并修改pa映射内的finish值

这是更新后的项目:

{
   id: 'dsfadsf'
   fa: { "apple" : { "S" : "76-100" }, "yolo" : { "S" : "0-25" }, "papa": { "S" : "dsfadsf"} }
   pa: { "finish" : { "BOOL" : true },    "userKey" : { "S" : "3e299e12-9e66" }  }
   createdAt: 32432432423
}

这是我尝试的,但不起作用

{
    TableName: tableName,
    Key: {
      id: "dsfadsf",
    },
    UpdateExpression: `SET #id = :id, fa.${itemName} = if_not_exists(fa.${itemName}, :text), pa.finish = if_not_exists(pa.finish, :finishval), #ca = :ca`,
    ExpressionAttributeNames: {
      "#id": "id",
      "#ca": createdAt
    },
    ExpressionAttributeValues: {
      ":id": "7fd9a81b-7a7c-4cfb-9c84-25dc2798a8f7",
      ":text": itemText,
      ":finishval": true,
      ":ca": 32432432423
    },
    ConditionExpression: `attribute_not_exists(id)`,
  };

共有1个答案

薛扬
2023-03-14

太长,读不下去了

这是不可能与您的项目的当前结构。以下是原因-为了满足您的需求,UpdateExpression需要采用以下形式:

if "fa" exists, add {"papa":"dsfadsf"} to it
else, create new "fa"={"papa":"dsfadsf"}

在所有DynamoDB更新表达式中,只有SET

由于以下原因,上述if-else条件无法在带有SET的UpdateExpression中表达:

>

  • 设置fa。papa='dsfadsf'将更新fa(如果它存在),但如果它不存在,则会出现错误,更新表达式中提供的文档路径对更新无效。

    SET fa={“papa”:“dsfadsf”}将创建新的fa,但如果它存在,将覆盖它。

    如果你尝试合并,添加

    现在我们只剩下ADD表达式了,但是ADD只在集合上起作用。所以如果你能负担得起把fa

    原始项目结构必须为:

    {
      "ca": 32432432423,
      "fa": [
        "apple:76-100",
        "yolo:0-25"
      ],
      "id": "dsfadsf",
      "pa": [
        "key:9e66"
      ]
    }
    

    在DynamoDB JSON中,这是:

    {
      "ca": {
        "N": "32432432423"
      },
      "fa": {
        "SS": [
          "apple:76-100",
          "yolo:0-25"
        ]
      },
      "id": {
        "S": "dsfadsf"
      },
      "pa": {
        "SS": [
          "key:9e66"
        ]
      }
    }
    

    现在,使用以下代码:

    let AWS = require("aws-sdk")
    let docClient = new AWS.DynamoDB.DocumentClient()
    docClient.update({
        TableName: "my-table",
        Key: { id: "dsfadsf" },
        UpdateExpression: `ADD fa :fa, pa :pa SET ca = :ca`,
        ExpressionAttributeValues: {
            ":fa": docClient.createSet(["papa:dsfadsf"]),
            ":pa": docClient.createSet(["finished"]),
            ":ca": 32432432423
        }
    }
    

    如果id为“dsfadsf”的项目已存在,则会按如下方式更新:

    {
      "ca": {
        "N": "32432432423"
      },
      "fa": {
        "SS": [
          "apple:76-100",
          "papa:dsfadsf",
          "yolo:0-25"
        ]
      },
      "id": {
        "S": "dsfadsf"
      },
      "pa": {
        "SS": [
          "finished",
          "key:9e66"
        ]
      }
    }
    

    如果id为“dsfadsf”的项目不存在,则会按如下方式创建:

    {
      "ca": {
        "N": "32432432423"
      },
      "fa": {
        "SS": [
          "papa:dsfadsf"
        ]
      },
      "id": {
        "S": "dsfadsf"
      },
      "pa": {
        "SS": [
          "finished"
        ]
      }
    }
    

  •  类似资料:
    • 在Laravel5.1中,对于MySQL insert,我希望查看记录是否已经存在,并在重复时更新,如果不存在,则创建新记录。 我已经搜索了SO,答案是旧laravel版本。在一个旧的主题中,它说去年在core中添加了一个新的方法。但是当我尝试时,我得到了错误: 这是我使用的查询: 其中,是该表中唯一的外键,我想更新记录(如果存在)或创建一个新记录。我尝试搜索5.1文档,但找不到我需要的信息。有人

    • 问题内容: 我是Elasticsearch的新手,目前正在实现用于搜索的过滤器。到目前为止,我的索引具有以下映射(我已经删除了一些字段): geo_distance字段将在location字段上实现,示例实例如下所示: 即采用geoJSON格式。 我了解我将必须更新索引,以使location字段的类型为,如文档(mapping-geo- point )中所述。似乎我必须删除索引并创建一个新索引,但

    • 对于一个小的新项目,我决定尝试一下JDBI(通常我使用hibernate/jpa)。 我喜欢使用@SqlUpdate/@Sql Query创建轻量级、基于注释的dao。 但是:在某些情况下,我无法确定是要创建实体还是更新现有实体。我会放置一个“选择”语句,并根据其返回值使用插入或更新语句。 问题:jdbi中的“仅接口”道是否以某种方式支持这一点?还是我必须自己编写一个“createOrUpdate

    • 问题内容: 我想创建一个模型对象,例如Person,如果不存在person的id,否则我将获得该person对象。 创建新人员的代码如下: 但是我不知道在哪里检查并获取现有的人对象。 问题答案: Django中已经有一个,https://docs.djangoproject.com/en/dev/ref/models/querysets/#get- or-create 对你来说可能是:

    • 插入新记录或更新(如果存在)的缩写是什么?

    • 问题内容: 我有一个条件,即StringBuilder会不断存储与大型平面文件(100兆字节)中的模式匹配的行。但是,达到条件后,我将StringBuilder变量的内容写入文本文件。 现在我想知道是否应该通过重置对象->使用相同的变量 要么 请提出就性能和OOM问题而言您认为哪个更好。 问题答案: 我认为通话仍然很昂贵,您应该这样做: 重置它。 更新: 查看完 源代码后 ,似乎完整保留了旧缓冲区