- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 putItem 正在运行。现在我想确保我只更新现有项目的新信息,或者将其添加为新项目:
条件表达式:
所以我在代码中加了一行:
putItemRequest.SetConditionExpression(" attribute_not_exists(" + partitionName + ") OR (attribute_exists(" + partitionName + ") AND (" + timestampName + " < :" + timestamp + "))");
这应该创建一个新项目,但它看起来是在尝试评估新项目不存在的“生成”属性。
putItem返回错误:
Invalid ConditionExpression: An expression attribute value used in expression is not defined; attribute value: :1461782160
从调试器来看,conditionExpression 看起来像:
m_conditionExpression = " attribute_not_exists(airport) OR (attribute_exists(airport) AND (generated < :1461782160))"
我正在努力避免:
有没有办法构造conditionExpression来满足我的期望?
编辑:使用updateItem时同样的问题
代码:
UpdateItemRequest updateItemRequest;
updateItemRequest.WithTableName(dynamoDbTableName);
AttributeValue hashPartition;
hashPartition.SetS(partition);
updateItemRequest.AddKey(partitionName, hashPartition);
AttributeValue hashSort;
hashSort.SetS(sort);
updateItemRequest.AddKey(sortName, hashSort);
AttributeValue hashAttribute;
hashAttribute.SetS(attribute);
Aws::Map<Aws::String, AttributeValue> attributeMap;
attributeMap[":a"] = hashAttribute;
updateItemRequest.SetUpdateExpression("SET " + timestampName + " = :" + timestamp + ", " + attributeName + " = :a");
updateItemRequest.SetExpressionAttributeValues(attributeMap);
// Allow only older items to be updated
updateItemRequest.SetConditionExpression("(" + timestampName + " < :" + timestamp + ")");
auto updateItemOutcome = dynamoDbClient.UpdateItem(updateItemRequest);
错误:
Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :1461781980
该属性值是时间戳。未定义,因为此项不存在,应创建。
这是我目前的工作:
ClientConfiguration config;
config.region = Aws::Region::US_WEST_2;
Aws::DynamoDB::DynamoDBClient dynamoDbClient(config);
Aws::Map<Aws::String, AttributeValue> aMap;
PutItemRequest putItemRequest;
putItemRequest.WithTableName(dynamoDbTableName);
AttributeValue hashPartition;
hashPartition.SetS(partition);
putItemRequest.AddItem(partitionName, hashPartition);
aMap[":p"] = hashPartition;
AttributeValue hashSort;
hashSort.SetS(sort);
putItemRequest.AddItem(sortName, hashSort);
aMap[":s"] = hashSort;
AttributeValue hashTimestamp;
hashTimestamp.SetN(timestamp);
putItemRequest.AddItem(timestampName, hashTimestamp);
AttributeValue hashAttribute;
hashAttribute.SetS(attribute);
putItemRequest.AddItem(attributeName, hashAttribute);
// Do not update existing items
putItemRequest.SetConditionExpression("NOT((" + partitionName + " = :p) AND (" + sortName + " = :s))");
putItemRequest.SetExpressionAttributeValues(aMap);
auto putItemOutcome = dynamoDbClient.PutItem(putItemRequest);
if(putItemOutcome.IsSuccess())
{
poco_information(logger, "writeDb PutItem Success: " + partition + ":" + sort);
status = SWIMPROCESSOR_OK;
}
else
{
if(putItemOutcome.GetError().GetErrorType() == DynamoDBErrors::CONDITIONAL_CHECK_FAILED) {
// item exists, try to update
Aws::Map<Aws::String, AttributeValue> uMap;
uMap[":t"] = hashTimestamp;
uMap[":a"] = hashAttribute;
UpdateItemRequest updateItemRequest;
updateItemRequest.WithTableName(dynamoDbTableName);
updateItemRequest.AddKey(partitionName, hashPartition);
updateItemRequest.AddKey(sortName, hashSort);
updateItemRequest.SetUpdateExpression("SET " + timestampName + " = :t, " + attributeName + " = :a");
updateItemRequest.SetExpressionAttributeValues(uMap);
// Allow only older items to be updated
updateItemRequest.SetConditionExpression(timestampName + " < :t");
auto updateItemOutcome = dynamoDbClient.UpdateItem(updateItemRequest);
if(updateItemOutcome.IsSuccess())
{
poco_information(logger, "writeDb UpdateItem Success: " + partition + ":" + sort);
status = SWIMPROCESSOR_OK;
}
else
{
if(putItemOutcome.GetError().GetErrorType() == DynamoDBErrors::CONDITIONAL_CHECK_FAILED) {
poco_information(logger, "writeDB UpdateItem new timestamp is older then current timestamp");
status = SWIMPROCESSOR_OK;
} else {
std::string msg(updateItemOutcome.GetError().GetMessage());
poco_error(logger, "writeDb UpdateItem Failure: " + msg);
status = SWIMPROCESSOR_DBWRITEERROR;
}
}
} else {
std::string msg(putItemOutcome.GetError().GetMessage());
poco_error(logger, "writeDb PutItem Failure: " + msg);
status = SWIMPROCESSOR_DBWRITEERROR;
}
}
最佳答案
服务的错误消息说您需要将 :1461782160
放入 attributeMap 中。 UpdateExpression 应该是 "SET "+ timestampName + "= :timestamp, "+ attributeName + "= :a"
并且您的 map 应定义如下。
AttributeValue hashAttributeA;
hashAttributeA.SetS(attribute)
AttributeValue hashAttributeTimestamp;
hashAttributeTimestamp.SetN(timestamp)
Aws::Map<Aws::String, AttributeValue> attributeMap;
attributeMap[":a"] = hashAttributeA;
attributeMap[":timestamp"] = hashAttributeTimestamp;
关于c++ - C++ 中的 DynamoDb putItem ConditionExpression - 添加或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289868/
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'}); expor
我们有一个带有分区键和排序键的 DynamoDB 表。两个键都是数字类型。我正在尝试使用 boto3 DynamoDB 客户端的 PutItem API 插入项目。我收到以下错误; Traceback
我们有一个带有分区键和排序键的 DynamoDB 表。两个键都是数字类型。我正在尝试使用 boto3 DynamoDB 客户端的 PutItem API 插入项目。我收到以下错误; Traceback
我正在使用 AmazonDynamoDBClient putItem 方法在数据库中插入项目。 putItem 的返回类型是 PutItemResult,但我将其设置为 null。 AmazonDyn
我想每次都替换现有记录,所以 putItem 对我来说是正确的操作。但每条记录都有一个创建日期,我不想更新它。因为创建日期始终相同。 是否可以在不首先查询 DynamoDB 的情况下实现此目的?谢谢。
我正在尝试在 DynamoDB put 中执行 ConditionExpression 以检查存储的 bool 值是否为真(在此示例中,用户是否已经过验证不要运行 put),我正在使用 javascr
我正在尝试使用条件在 DynamoDB 上放置一个 interm,但不起作用。 我有一个用户表和一个作为主键的属性 id,属性名称必须是唯一的。 conditions := aws.String("N
我正在尝试从部署在 AWS ElasticBeanStalk 上的 Node 应用程序访问 DynamoDB。我收到一个错误 User is not authorized to perform: dy
我现在刚刚使用 Amazon AWS DynamoDB。在 Future 中,我想将 Items 放在我的表中,但前提是不存在具有相同键的 Item,这样我就不会覆盖现有值。你知道我是怎么做到的吗?我
我在本地的 DynamoDb 中有一个简单的表,并尝试放置这样的项目: var options = {name : "test", creator : "Testcreator
我的 putItem 正在运行。现在我想确保我只更新现有项目的新信息,或者将其添加为新项目: 条件表达式: 如果 partition:sort 不存在则创建新项 如果属性生成则更新 attribut
我正在开发一个 lambda 函数,它将存储有关不同用户的信息。我有一个属性,userID 作为我的主分区键,storedObject 作为我的主排序键。当我使用 PutItem 时,我希望它仅添加
我有一个简单的 JSON 数组,我正在尝试使用变量设置映射键。该数组使用 DynamoDB 的映射功能,第一个名为“hours”的映射包含一个嵌套映射,我希望该映射的键值为 15。但是,因为我希望该键
我在使用无服务器框架的 Lambda 函数时遇到问题,该函数应该将数据放入 DynamoDB。我不确定这个问题,因为当我运行:sls invoke local -f scrape -d 'the-la
我正在将数组中的变量插入 AWS DynamoDB$dbf[$a]['变量1'], $dbf[$a]['变量2'], $dbf[$a]['变量3'] ... 对于一些$a,只设置了'variable1
我有一个 EC2 实例,它打开一个 json 文件,读取每一行并对两个表执行 putItem 操作。 在没有putItem操作的情况下,Golang解析一个67k行的文件大约需要3秒。 通过 putI
我正在尝试设置一个从 AWS Lambda 到 DynamoDB 的小型 api,但我无法确定是否以及如何将对象数组写入键。 我有一个类似的对象 { "teamName": "Team Awe
我有一个用例,在这种情况下,单个请求中的条目列表要更新的情况并不多,而且大多数情况下,只请求更新单个条目。但在未来,这可能会增长,因此我正在考虑使用 BatchPutItem 而不是 PutItem。
我正在努力实现我认为非常标准的东西,但我已经碰壁了。我有一堆数据要存储在 DynamoDB 中 const putDataParams = { TableName: "sens
根据 DynamoDb 文档,为什么有人会使用 updateItem 而不是 putItem? PutItem - 将单个项目写入表中。如果表中存在具有相同主键的项目,则该操作将替换该项目。为了计算
我是一名优秀的程序员,十分优秀!