gpt4 book ai didi

node.js - 创建或更新 dynamodb

转载 作者:行者123 更新时间:2023-12-03 09:36:06 28 4
gpt4 key购买 nike

目前,我正在通过查询检查该项目是否存在,然后我正在使用 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 Map 内的现有项目)并修改 pa Map 内的完成值
这是更新后的项目:
{
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)`,
};

最佳答案

TLDR
这对于您项目的当前结构是不可能的。更改 fa & pa要字符串集,去掉finish: true & 使用 ADD 更新表达式。

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

if "fa" exists, add {"papa":"dsfadsf"} to it
else, create new "fa"={"papa":"dsfadsf"}
所有的 DynamoDB update expressions , 在这种情况下只能使用 SET & ADD 。
以上 if else条件不能用 UpdateExpression 表示由于以下原因使用 SET:
  • SET fa.papa = 'dsfadsf'将更新 fa如果存在,但如果不存在,则会收到错误 The document path provided in the update expression is invalid for update .
  • SET fa = {"papa":"dsfadsf"}将创建新 fa但如果存在则覆盖它。

  • 如果尝试结合 ADD & SET 来实现上述 if else条件,变成类似 ADD fa {} SET fa.papa = dsfadsf ,您会收到错误 Two document paths overlap with each other; must remove or rewrite one of these paths所以我们现在只剩下 ADD 表达式,但 ADD 只适用于集合。所以如果你有能力翻 fa 的内容& pa成组字符串,您可以实现“一次创建或更新”的目标。这是它的工作原理:
    原始项目结构必须是:
    {
    "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"
    ]
    }
    }

    关于node.js - 创建或更新 dynamodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62842912/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com