node.js - 使用数组为大数据设计 DynamoDB。超过 400k
问题描述
我正在使用node.js
并记录事件时间和事件数据,我想使用 AWS DynamoDB
Table。
单个数据和一键数据模式示例,如下所示。
var want_to_update_data = [ // contain json more or same than 1
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
];
var saved_data = { // DynamoDB Saved Data Sample with Key "ABCD"
"Key" : "ABCD",
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
}
上面的数据仅用于样本。json 包含更多的键值。
对于更新单个 json,我的服务器代码喜欢下。
app.get('/insert', req, res) {
var update_key = req.body.update_key; // "ABCD"
var want_to_update_data = req.body.update_data; // [ {} ]
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
AWS.config.update({
region: "region",
endpoint: "endpoint",
accessKeyId: "access_key",
secretAccessKey: "secret_key",
});
var params = {
TableName: "TableName",
Key: update_key,
UpdateExpression: updateExpression,
ExpressionAttributeValues: expressionAttributeValues,
ReturnValues: "UPDATED_NEW"
});
var dynamodbClient = new AWS.DynamoDB.DocumentClient();
dynamodbClient.update(params, function(err, data) {
if(err) { /* handle error */ }
else { /* handle after update complete */ }
});
});
简单地说,它可以工作,但 AWS DynamoDB 不能一次更改超过 4kb。
因此,如果数组数据大于 4k,则 list_append 无法处理ValidationException: Item size to update has exceeded the maximum allowed size
错误消息。
我想保留所有事件并想对event-time
键进行排序。
如何更改我的 DynamoDB 架构?
根据代码只是我的猜测。
是否可以?
{
"Key" : "ABCD",
/*
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
*/
"events" : { // is it possible events['some-date'] could be sort-key?
...
"2020-12-28 09:30:17" : 35,
"2021-01-01 19:11:12" : 16,
"2021-01-02 10:11:12" : 19,
...
}
}
/*
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
*/
// under 2 line is just for sample. json key is not fixed
var event_time = '2021-01-02 10:11:12';
var single_json = want_to_update_data[event_time];
// if number-start key is not allow(event_time), prefix append could be like "D_2021~~"
var updateExpression = `SET events.${event_time} = :dl`;
var expressionAttributeValues = {':dl' : single_json }; // single json
感谢您阅读我的问题。
我想创建新表来保存我的事件 json 数据。(不是 S3。使用 DynamoDB)
解决方案
推荐阅读
- google-apps-script - 谷歌应用脚本(谷歌表单)中的 pagebreakitem 和 sectionheaderitem 有什么区别?
- web-crawler - 如何从维基百科中提取语义事实
- python - 查找每两行 pandas data.frame 的字符串之间的差异
- c# - como puedo usalor HttpPostedFileBase en asp.net core?
- angular - Firestore数据的角度循环
- windows - Dll注入记事本时内存分配不成功
- javascript - 如何从javascript中只有0索引的数组中读取对象
- java - 仅从第二个请求中获取值
- intellij-idea - java.lang.UnsatisfiedLinkError:java.library.path 中没有 cplex1290
- html - 用css翻转卡片时,背面显示但无法使用