我正在使用DynamoDB,我想只在主鍵不存在的情況下創建一個主鍵和一個屬性。
如果主鍵存在,我將回傳主鍵和屬性。
。到目前為止,我已經讓它在主鍵不存在的情況下進行 upsert,但我遇到的問題是,即使主鍵 alexaDeviceId 已經存在,它仍然在更新屬性 connectionString。
const str = randomize('Aa0', 6)。
const params = {
TableName: "alexa-connections-table"。
Key: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID。
}
},
ExpressionAttributeNames: {
"#CS": "connectionString"ExpressionAttributeValues: {
":connection": {
S: str
}
},
ReturnValues: "ALL_NEW",
UpdateExpression: "SET #CS = :connection".
};
try {
var result = await dynamodb.updateItem(params).promise()。
console.log('結果。 JSON.stringify(result))。)
return res.status(200)。 send(JSON.stringify(result))。
} catch (err) {
console.log(err)。
return res.status(500).send({ reason: err })。
}
因此,例如,當我第一次用一個空的dynamoDB表運行lambda函式時:
它應該添加主鍵。
它應該添加主鍵alexaDeviceId和6位數屬性(按預期作業)
Column alexaDeviceId: AHJYGV...
Column connectionString: 5Dz2SD
當我再次運行該程式時
它不應該做任何更新并回傳{"Attributes":{"ConnectionString":{"S": "5Dz2SD"}, "alexaDeviceId":{"S": "AHJYGV..."}} 相反,它正在做任何更新。
相反,它正在更新connectionString并回傳一個新的值(意外的結果)
{"Attributes":{"s": "DxBVmH"}, "alexaDeviceId":{"s": "AHJYGV..."}}
我如何添加一個連接字串?
如果alexaDeviceId的主鍵已經存在,我如何添加一個條件來不更新connectionString?
Edit:___________________________________________________________________
我試著用一個putItem來代替,但我不知道正確的語法:
const str = randomize('Aa0', 6)。
const params = {
TableName: "alexa-connections-table"。
Item: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID。
},
"connectionString"/span>: {
S: str
}
},
ExpressionAttributeValues: {
':ADI': {'S': process.env.TEST_ALEXA_DEVICE_ID}.
},
ConditionExpression: 'if_not_exists(alexaDeviceId, :ADI)'}; ConditionExpression: 'if_not_exists(alexaDeviceId, :ADI)
};
try {
var result = await dynamodb.putItem(params).promise()。
console.log('結果。 JSON.stringify(result))。)
return res.status(200)。 send(JSON.stringify(result))。
} catch (err) {
console.log(err)。
return res.status(500).send({ reason: err })。
}
給我的錯誤是:
ValidationException。無效的ConditionExpression。條件運算式中不允許使用該函式;函式:if_not_exists
uj5u.com熱心網友回復:
我用.putItem()代替了.updateItem()和ConditionExpression:
ConditionExpression: 'attributee_not_exists(#ADI)'
const str = randomize('Aa0', 6)。
const params = {
TableName: "alexa-connections-table"。
Item: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID。
},
"connectionString"/span>: {
S: str
}
},
ExpressionAttributeNames: {
"#ADI"/span>: "alexaDeviceId"ConditionExpression:
};
try {
var result = await dynamodb.putItem(params).promise()。
console.log('結果。 JSON.stringify(result))。)
return res.status(200)。 send(JSON.stringify(result))。
} catch (err) {
console.log(err)。
return res.status(500).send({ reason: err })。
}
如果主鍵在該表中不存在,這將創建一個新的屬性為connectionString的專案。
console.log('結果。' JSON.stringify(result));
回傳一個ConditionalCheckFailedException
ConditionalCheckFailedException。如果一個特定的主鍵已經存在,則條件請求失敗。
如果一個主鍵不存在,它會回傳{}(意味著.putItem()是成功的)。
uj5u.com熱心網友回復:
在做更新之前,查詢DB的具體屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325345.html
標籤:
