2016-09-20 58 views
0

所以我一直在使用dynamodb在nodejs express应用程序中,并且我有一个特定的表,其中有一个只是空列表的字段,我想将一个字符串附加到列表中。将字符串添加到dynamodb表中的列表中

表名是“dev_entrants”这里是表的一个例子:

---------------------------------------- 
primary Key   Sort Key  
eventID   | eventType | entrants 
---------------------------------------- 
Qual-919-w5wm1xhnw | Qual  | [] 

---------------------------------------- 

所以,我收到一个POST请求,然后将其路由通过快递和它在那里做类型检查后,来到一个功能和所有我尝试添加的东西到我的表:

import AWS from 'aws-sdk'; 

const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-west-1'}); 

const db = { 
    docClient 
}; 

... 

const entrantsParams = { 
    'TableName' : 'dev_entrants', 
    'Key': { 
     'eventID' : 'Qual-919-w5wm1xhnw', 
    }, 
    'UpdateExpression' : "SET #attrName = list_append(#attrName, :attrValue)", 
    'ExpressionAttributeNames' : { 
     '#attrName' : 'entrants' 
    }, 
    'ExpressionAttributeValues' : { 
     ':attrValue' : ['joe'], 
    } 
    }; 

    const updateEntrantsPromise = db.docClient.update(entrantsParams).promise(); 

(与它们所代表的字符串对于这个例子的目的,我已经取代变量)

我花了6个小时左右阅读了不同的文档,以及堆栈溢出试图找到答案。

我得到的当前错误是提供的键元素与模式不匹配。如果我删除attrValue的括号,那么我得到错误的操作数类型。我知道表中存在关键字,因为我从那里复制并粘贴了它。此外,我成功地从另一个功能添加到表中的东西,所以我的连接工作正常。任何人都可以请帮我吗?

回答

2

您需要在Key对象中包含eventType,因为您的表模式具有排序键。如果您的表具有排序/分区键,则需要将其与主键一起包含。请尝试以下操作:

const entrantsParams = { 
    'TableName' : 'dev_entrants', 
    'Key': { 
    'eventID' : 'Qual-919-w5wm1xhnw', 
    'eventType' : 'Qual' 
    }, 
    'UpdateExpression' : "SET #attrName = list_append(if_not_exists(#attrName, :empty_list), :attrValue)", 
    'ExpressionAttributeNames' : { 
    '#attrName' : 'entrants' 
    }, 
    'ExpressionAttributeValues' : { 
    ':attrValue' : ['joe'], 
    ':empty_list': [] 
    } 
}; 
+0

非常感谢!我正在浏览文档,从未看到有关此的说明。这实际上很棒,因为它实际上解决了我在if_not_exists的另一个更新中遇到的下一个问题! – Pljeskavica

相关问题