将数据存储在dynamodb中

时间:2019-03-18 01:47:05

标签: amazon-dynamodb

我需要将不同的数据键存储在dynamodb表中。我正在使用node.js / aws lambda / dynamodb。

我要存储的信息看起来像这样:

[
 {
  "boxname":"foo",
  "contents": [
   {
    "itemid":"1",
    "itemname":"apple",
    "itemamount":"7",
    "itemdateadded":"03-17-2019"    
   }
  ]
  "boxname":"bar",
  "contents": [
   {
    "itemid":"1",
    "itemname":"apple",
    "itemamount":"2",
    "itemdateadded":"03-16-2019"
   }
   {
    "itemid":"2",
    "itemname":"orange",
    "itemamount":"1",
    "itemdateadded":"03-17-2019"
   }
  ]
 }
]

基本上,所以我可以稍后查询,然后从每个框中添加和删除每个项目...我在解决此问题时遇到了很多麻烦!有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

DynamoDB表

首先,您将需要创建DynamoDB Table。为此,您至少需要有一个用作表的主键的表Hash Key,还可以有一个可选的Range Key用作表的组合主键

从您的示例数据来看,boxname似乎与表Hash Key相符

您可以仅使用哈希键立即创建DynamoDB Table,因为不需要预先提供所有其他属性,因此在创建新记录时可以动态添加新的/附加的属性

创建记录

您可以使用PutItem API在DynamoDB中创建记录

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html

查询记录

您可以使用Query API通过表的哈希键和范围键查询记录

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

扫描记录

当您无法基于表的Scan和/或Non Key来获取记录时,请使用Hash Key API来按任何Range Key属性来扫描记录

通常不建议创建大量使用Scan API的Table结构,因为它实际上执行Scan操作。相反,建议构建针对查询操作优化的表

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

获取记录

您可以使用GetItem API通过表的哈希键以及范围键来获取单个记录

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html

希望以上信息对您入门DynamoDB有帮助

答案 1 :(得分:0)

虽然boxname是唯一的,但我强烈不同意它非常适合作为哈希键(根据@OhChinBoon的回答)。

由于boxname仅是一个名称,因此意味着它不是统一生成的(如UUID)。假设您的boxname就像Johan/Johanan/Johann/Johannes/Johdy/John。如果您的表越来越大,DynamoDB将很难在这些键上进行查询。

我建议您在结构中添加一个新属性,该属性将成为您的哈希键。我们称之为id

现在,如果您需要查询boxname,则可以在其上简单地创建一个Global Secondary Index(GSI),从而避免了诸如扫描之类的高成本操作(如果需要,请选中DynamoDB Best Practices) 。仅将扫描作为最后的手段。

基于上述内容,您的结构应如下所示:

{
    "id": "7ba6d8b8-afef-440e-98a2-fee38a4e3381" (hash key)
    "boxname": "foo" (GSI),
    "contents": [{
        "itemid": "1",
        "itemname": "apple",
        "itemamount": "7",
        "itemdateadded": "03-17-2019"
    }]
}

请记住,您只能在顶级属性上创建GSI,这意味着您无法为JSON / Array中的属性创建GSI。因此,如果您最终需要查询contents中的内容,那么DynamoDB可能不是一个合适的选择(尽管我不认为这是您的情况,我认为这值得一提)