Добавить новый объект в дочерний узел документа DynamoDB.C#

Место общения программистов C#
Ответить
Anonymous
 Добавить новый объект в дочерний узел документа DynamoDB.

Сообщение Anonymous »

У меня есть большой объект 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»