У меня есть большой объект JSON, который я пытаюсь поместить в таблицу DynamoDB.
Размер превышает 400 МБ, поэтому мне приходится его разбить.
Я пытался ответить на этот вопрос здесь, используя node.js, но он не работает должным образом:
Добавить новый объект в массив JSON в DynamoDB с помощью NodeJS
Я также прочитал документацию здесь:
https://docs.aws.amazon.com/amazondynam ... sions.html
https://docs .aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.Multiple
Если бы элемент не был таким большим, я мог бы просто сделать
AWS.Dynamodb.Table.PutItemAsync(document, client);
DynamoDB является предпочтительным решением этой проблемы, хотя я знаю, что статический JSON в S3 также будет работать, используя Lambda для его обновления (ежедневно?)
Два маршрута, которые я пробовал, либо объединяют поле #Data в один длинный список элементов (а не список объектов)
UpdateExpression = "SET #data = list_append(if_not_exists(#data, :empty_list), :item)"`
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue { L = dataDocument.Values.ToList() } }
}
Или
Не удалось сослаться на то, что я не могу отправить элемент типаAttributeValue.M с помощью добавления
UpdateExpression = "add #data :item",
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue { M = dataDocument }},
}
Метод
var table = Table.LoadTable(_dynamoClient, AnalyticsTableName);
var strippedDoc = new AnalyticsDataCluster
{
PK = item.PK,
SK = item.SK,
Data = new List()
};
await table.PutItemAsync(Document.FromJson(JsonSerializer.Serialize(strippedDoc)));
foreach (var data in item.Data)
{
var dataDocument = Document.FromJson(JsonSerializer.Serialize(data)).ToAttributeMap();
var request = new UpdateItemRequest
{
TableName = AnalyticsTableName,
Key = new Dictionary
{
{ "PK", new AttributeValue { S = item.PK } },
{ "SK", new AttributeValue { S = item.SK } }
},
UpdateExpression = "add #data :item",
ExpressionAttributeNames = new Dictionary
{
{ "#data", "Data" }
},
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue
{
M = dataDocument
}
},
{ ":empty_list", new AttributeValue { IsLSet = true}},
{ ":id", new AttributeValue{ S = data.Id}}
},
};
var response = await _dynamoClient.UpdateItemAsync(request);
}
}
Объект данных
// Analytics data package
public AnalyticsData(Dictionary attributeValues) : this()
{
Id = attributeValues.TryGetValue("Id", out var idValue) ? idValue.S : null;
AccessDateTime = attributeValues.TryGetValue("AccessDateTime", out var loginDateTimeValue) ? DateTime.Parse(loginDateTimeValue.S) : DateTime.MinValue;
RequestedUri = attributeValues.TryGetValue("RequestedUri", out var requestedUriValue) ? requestedUriValue.S : null;
Person = new PersonBase
{
Id = Convert.ToInt32(attributeValues["Person"].M["Id"].N),
FirstName = attributeValues["Person"].M.TryGetValue("FirstName", out var firstNameValue) ? firstNameValue.S : null,
// truncated for clarity
};
}
public string? Id { get; set; }
public DateTime AccessDateTime { get; set; }
public string? RequestedUri { get; set; }
public PersonBase? Person { get; set; }
// truncated for clarity
}
public class PersonBase
{
public int Id { get; set; }
public string? FirstName { get; set; }
// etc
}
Сообщение об ошибке
Amazon.DynamoDBv2.AmazonDynamoDBException:
'Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M'
Подробнее здесь: https://stackoverflow.com/questions/788 ... child-node
Добавить новый объект в дочерний узел документа DynamoDB. ⇐ C#
Место общения программистов C#
-
Anonymous
1722291553
Anonymous
У меня есть большой объект JSON, который я пытаюсь поместить в таблицу DynamoDB.
Размер превышает 400 МБ, поэтому мне приходится его разбить.
Я пытался ответить на этот вопрос здесь, используя node.js, но он не работает должным образом:
Добавить новый объект в массив JSON в DynamoDB с помощью NodeJS
Я также прочитал документацию здесь:
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html
https://docs .aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.Multiple
Если бы элемент не был таким большим, я мог бы просто сделать
AWS.Dynamodb.Table.PutItemAsync(document, client);
DynamoDB является предпочтительным решением этой проблемы, хотя я знаю, что статический JSON в S3 также будет работать, используя Lambda для его обновления (ежедневно?)
Два маршрута, которые я пробовал, либо объединяют поле #Data в один длинный список элементов (а не список объектов)
UpdateExpression = "SET #data = list_append(if_not_exists(#data, :empty_list), :item)"`
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue { L = dataDocument.Values.ToList() } }
}
Или
Не удалось сослаться на то, что я не могу отправить элемент типаAttributeValue.M с помощью добавления
UpdateExpression = "add #data :item",
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue { M = dataDocument }},
}
Метод
var table = Table.LoadTable(_dynamoClient, AnalyticsTableName);
var strippedDoc = new AnalyticsDataCluster
{
PK = item.PK,
SK = item.SK,
Data = new List()
};
await table.PutItemAsync(Document.FromJson(JsonSerializer.Serialize(strippedDoc)));
foreach (var data in item.Data)
{
var dataDocument = Document.FromJson(JsonSerializer.Serialize(data)).ToAttributeMap();
var request = new UpdateItemRequest
{
TableName = AnalyticsTableName,
Key = new Dictionary
{
{ "PK", new AttributeValue { S = item.PK } },
{ "SK", new AttributeValue { S = item.SK } }
},
UpdateExpression = "add #data :item",
ExpressionAttributeNames = new Dictionary
{
{ "#data", "Data" }
},
ExpressionAttributeValues = new Dictionary
{
{ ":item", new AttributeValue
{
M = dataDocument
}
},
{ ":empty_list", new AttributeValue { IsLSet = true}},
{ ":id", new AttributeValue{ S = data.Id}}
},
};
var response = await _dynamoClient.UpdateItemAsync(request);
}
}
Объект данных
// Analytics data package
public AnalyticsData(Dictionary attributeValues) : this()
{
Id = attributeValues.TryGetValue("Id", out var idValue) ? idValue.S : null;
AccessDateTime = attributeValues.TryGetValue("AccessDateTime", out var loginDateTimeValue) ? DateTime.Parse(loginDateTimeValue.S) : DateTime.MinValue;
RequestedUri = attributeValues.TryGetValue("RequestedUri", out var requestedUriValue) ? requestedUriValue.S : null;
Person = new PersonBase
{
Id = Convert.ToInt32(attributeValues["Person"].M["Id"].N),
FirstName = attributeValues["Person"].M.TryGetValue("FirstName", out var firstNameValue) ? firstNameValue.S : null,
// truncated for clarity
};
}
public string? Id { get; set; }
public DateTime AccessDateTime { get; set; }
public string? RequestedUri { get; set; }
public PersonBase? Person { get; set; }
// truncated for clarity
}
public class PersonBase
{
public int Id { get; set; }
public string? FirstName { get; set; }
// etc
}
Сообщение об ошибке
Amazon.DynamoDBv2.AmazonDynamoDBException:
'Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M'
Подробнее здесь: [url]https://stackoverflow.com/questions/78809169/append-new-object-to-a-dynamodb-document-child-node[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия