我需要将不同的数据键存储在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"
}
]
}
]
基本上,所以我可以稍后查询,然后从每个框中添加和删除每个项目...我在解决此问题时遇到了很多麻烦!有人可以帮忙吗?
答案 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可能不是一个合适的选择(尽管我不认为这是您的情况,我认为这值得一提)