如何解决有没有更简单的方法将javascript对象转换为dynamodb更新表达式?
我正在使用带有dynamodb的nodejs aws-sdk/clients/dynamodb
库。我需要更新表中的项目。下面是更新项目的示例代码:
params = {
TableName:table,Key:{
"year": year,"title": title
},UpdateExpression: "set info.rating = info.rating + :val",ExpressionAttributeValues:{
":val": 1
},ReturnValues:"UPDATED_NEW"
};
我将必须在info
的{{1}}中指定每个属性。我的UpdateExpression
对象很大,我正在寻找一种更简单的方法。是否有内置方法支持将对象更新为dynamodb项目?像这样:
info
解决方法
E.J. 给出的答案Brennan 非常适合替换整个项目的情况。 DocumentClient 减轻了处理 DynamoDB 属性类型的麻烦,但给出的示例使用了 put
方法。根据文档 put
传递到 putItem
其中
创建一个新项目,或用新项目替换旧项目
这意味着它不会帮助您对没有完整记录(并且可以完全替换)的现有项目进行部分更新。对于部分更新,您必须使用 updateItem
,或者它的 DocumentClient 对应项 update
。
AWS 实验室有 published a utility 来帮助构建更新表达式以与 updateItem
一起使用。由于我通常更喜欢使用 DocumentClient,因此我使用 DynamoDB 的 Converter 提供的实用程序函数解组值(是的,我知道这有点来回,但它使测试更容易)。
const AWS = require('aws-sdk');
const db = new AWS.DynamoDB.DocumentClient();
const { UpdateExpression,ExpressionAttributes } = require('@aws/dynamodb-expressions');
const { unmarshall } = AWS.DynamoDB.Converter;
const updateExpressionProps = ({ category,classification }) => {
attributes = new ExpressionAttributes();
expression = new UpdateExpression();
expression.set('category',category);
expression.set('classification',classification);
return {
UpdateExpression: expression.serialize(attributes),ExpressionAttributeNames: attributes.names,ExpressionAttributeValues: unmarshall(attributes.values),};
};
const updateRequest = async ({ id,subject,category,classification }) =>
await db
.update({
TableName: 'table-name',Key: {
id,},...updateExpressionProps({ category,classification }),})
.promise();
这段代码仅更新了用 category
和 classification
标识的记录上的 id
和 subject
属性,而无需手动操作构建正确的 UpdateExpression 字符串。这个例子可以很容易地推广到整个项目中可重用的东西。
您可以使用Document Client:
适用于JavaScript的AWS开发工具包的版本2.2.0引入了对 AWS.DynamoDB名称空间中的文档客户端抽象。的 文档客户端抽象使读取和写入数据更加容易 带有适用于JavaScript的AWS开发工具包的Amazon DynamoDB。现在您可以使用 本机JavaScript对象,而不将其注释为AttributeValue 类型。
例如:
var docClient = new AWS.DynamoDB.DocumentClient({region: 'us-west-2'});
var params = {
Item: {
hashkey: 'key',boolAttr: true,listAttr: [1,'baz',true]
mapAttr: {
foo: 'bar'
}
},TableName: 'table'
};
docClient.put(params,function(err,data){
if (err) console.log(err);
else console.log(data);
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。