Node.js 为什么;documentClient.put";是否在DynamoDB中执行更新而不是插入?
我有一个简单的逻辑,我想使用Node.js 为什么;documentClient.put";是否在DynamoDB中执行更新而不是插入?,node.js,typescript,amazon-web-services,amazon-dynamodb,documentclient,Node.js,Typescript,Amazon Web Services,Amazon Dynamodb,Documentclient,我有一个简单的逻辑,我想使用AWS.DynamoDB.DocumentClient在表中插入记录。下面是我正在使用的代码。在这里,我注意到.put正在更新记录,但不确定原因 在CW中检查日志时,我没有看到任何错误,因此不确定我在这里遗漏了什么 代码: async addEvent(incomingModel: MyModel): Promise <MyModel> { const dynamoModel: MyModel = { fieldOne: incom
AWS.DynamoDB.DocumentClient在表中插入记录。下面是我正在使用的代码。在这里,我注意到.put
正在更新记录,但不确定原因
在CW中检查日志时,我没有看到任何错误,因此不确定我在这里遗漏了什么
代码:
async addEvent(incomingModel: MyModel): Promise <MyModel> {
const dynamoModel: MyModel = {
fieldOne: incomingModel.fieldOne,
fieldTwo: incomingModel.fieldTwo,
"One#two#three": `${incomingModel.one}#${incomingModel.two}#${incomingModel.three}`,
fieldThree: incomingModel.fieldThree,
fieldFour: incomingModel.fieldFour,
};
var params = {
TableName: 'Table',
Item: dynamoModel,
};
return this.documentClient
.put(params)
.then((data) => {
this.logger.debug(
"Response received from Dynamo after adding an incomingModel",
data,
this.constructor.name,
);
return data as MyModel;
})
.catch((error) => {
const errorMessage = JSON.stringify(error);
this.logger.error(
`Error creating incomingModel with body of ${errorMessage}`,
error,
this.constructor.name,
);
throw error;
});
}
异步addEvent(incomingModel:MyModel):承诺{
常量动态模型:MyModel={
fieldOne:incomingModel.fieldOne,
Field2:incomingModel.Field2,
“一#二#三”:“${incomingModel.一}${incomingModel.二}${incomingModel.三}”,
字段三:输入模型。字段三,
fieldFour:incomingModel.fieldFour,
};
变量参数={
TableName:'表',
项目:dynamoModel,
};
返回此.documentClient
.put(参数)
。然后((数据)=>{
此为.logger.debug(
“添加incomingModel后收到Dynamo的响应”,
数据
this.constructor.name,
);
以MyModel的形式返回数据;
})
.catch((错误)=>{
const errorMessage=JSON.stringify(错误);
这是一个错误(
`创建主体为${errorMessage}`的incomingModel时出错,
错误
this.constructor.name,
);
投掷误差;
});
}
这是put
操作的预期行为。从(我的)重点:
创建新项目,或用新项目替换旧项目。如果指定表中已存在与新项具有相同主键的项,则新项将完全替换现有项
这是put
操作的预期行为。从(我的)重点:
创建新项目,或用新项目替换旧项目。如果指定表中已存在与新项具有相同主键的项,则新项将完全替换现有项
正如赛斯所提到的,这是DynamoDb的默认行为
要避免更新,可以使用“ConditionExpression”。在我的示例中,我将HashKey命名为“PK”,将RangeKey命名为“SK”:
async function put(Item, TableName){
const params = {
TableName,
Item,
ExpressionAttributeNames : {
'#pk' : 'PK',
'#sk' : 'SK',
},
ConditionExpression : 'attribute_not_exists(#pk) AND attribute_not_exists(#sk)',
};
const result = await documentClient.put(params).promise();
// ... do the rest....
}
如果项目已经存在(两个键都匹配),事务将失败,并给出一个“ConditionalCheckFailedException:条件请求失败”
我希望这将是有用的 正如赛斯所提到的,这是DynamoDb的默认行为
要避免更新,可以使用“ConditionExpression”。在我的示例中,我将HashKey命名为“PK”,将RangeKey命名为“SK”:
async function put(Item, TableName){
const params = {
TableName,
Item,
ExpressionAttributeNames : {
'#pk' : 'PK',
'#sk' : 'SK',
},
ConditionExpression : 'attribute_not_exists(#pk) AND attribute_not_exists(#sk)',
};
const result = await documentClient.put(params).promise();
// ... do the rest....
}
如果项目已经存在(两个键都匹配),事务将失败,并给出一个“ConditionalCheckFailedException:条件请求失败”
我希望这将是有用的 这对于PutItem
来说是正确的,但是这里我使用的是Put
。在这里,嗯,我不确定我是否注意到了区别。Put
API说“通过委托给AWS.DynamoDB.putItem()
,创建一个新项,或者用一个新项替换一个旧项”。我不知道你的主键是什么样子,但也许这就是这里发生的事情。DynamoDB认为您正在操作一个旧项目,并将其委托给putItem。你期待什么样的行为?我假设您希望使用put
操作创建(而不是更新)记录。这个假设正确吗?是的。这就是预期。如果您正在对DynamoDB中已经存在的项执行put
操作,则客户端的行为符合预期<如果不存在具有该主键的项,则代码>放置
将创建一个新项。如果项目确实存在,它将委托给putItem
,然后将完全替换现有项目。主键在DynamoDB中是唯一的,因此没有两个项目可以具有相同的主键。我看不出这段代码有任何错误,我已经找到了答案。在这里,我的主键不是唯一的,所以当combine primary+sortKey时,它就工作了。这是我今天学到的新行为。谢谢你的建议。这对于PutItem
来说是正确的,但我现在使用的是Put
。在这里,嗯,我不确定我是否注意到了区别。Put
API说“通过委托给AWS.DynamoDB.putItem()
,创建一个新项,或者用一个新项替换一个旧项”。我不知道你的主键是什么样子,但也许这就是这里发生的事情。DynamoDB认为您正在操作一个旧项目,并将其委托给putItem。你期待什么样的行为?我假设您希望使用put
操作创建(而不是更新)记录。这个假设正确吗?是的。这就是预期。如果您正在对DynamoDB中已经存在的项执行put
操作,则客户端的行为符合预期<如果不存在具有该主键的项,则代码>放置将创建一个新项。如果项目确实存在,它将委托给putItem
,然后将完全替换现有项目。主键在DynamoDB中是唯一的,因此没有两个项目可以具有相同的主键。我看不出这段代码有任何错误,我已经找到了答案。在这里,我的主键不是唯一的,所以当combine primary+sortKey时,它就工作了。这是我今天学到的新行为。谢谢你的建议。