TL; DR
Это невозможно с текущей структурой вашего элемента. Измените fa
и pa
на наборы строк, избавьтесь от finish: true
и используйте выражение обновления ADD.
Это невозможно с текущей структурой вашего предмета. Вот почему - чтобы соответствовать вашим требованиям, UpdateExpression
должен иметь форму:
if "fa" exists, add {"papa":"dsfadsf"} to it
else, create new "fa"={"papa":"dsfadsf"}
Из всех выражений обновления DynamoDB в этом сценарии можно использовать только 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
в наборы строк, вы можете достичь своей цели «создать или обновить в 1 go». Вот как это будет работать:
Исходная структура элемента должна быть:
{
"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"
]
}
}