NET C#-如何在dynamodb中通过映射值在具有条件表达式的列表中设置嵌套映射?
问题 我们需要将一个映射值设置到一个列表中,问题是我们不知道如何在映射中引用这些值中的一个来执行条件表达式中的检查,所以当数据到来时,我们没有任何重复项 问题是,我们试图在一个没有get的“list\u append”中使用“if\u not\u exists”进行检查,但副本仍然存在,我们尝试了NET C#-如何在dynamodb中通过映射值在具有条件表达式的列表中设置嵌套映射?,c#,.net,amazon-dynamodb,amazon,dynamodb-queries,C#,.net,Amazon Dynamodb,Amazon,Dynamodb Queries,问题 我们需要将一个映射值设置到一个列表中,问题是我们不知道如何在映射中引用这些值中的一个来执行条件表达式中的检查,所以当数据到来时,我们没有任何重复项 问题是,我们试图在一个没有get的“list\u append”中使用“if\u not\u exists”进行检查,但副本仍然存在,我们尝试了 “不包含” 在列表中使用索引搜索该值以进行检查 与结构的比较 更新项目结构 { "DataToSave": { "L": [ {
{
"DataToSave": {
"L": [
{
"M": {
"Action": {
"N": "1"
},
"Date": {
"S": "25/08/2020 8:31:48"
},
"Id1": {
"N": ""
},
"Id2": {
"S": "d"
},
"DataToCheckCondition": {
"S": "151"
},
"Price": {
"N": "101"
}
}
}
]
},
"PartitionDate": {
"S": "20200821"
},
"SortedIDKey": {
"N": "1"
}
}
一些示例以内联方式进行了注释
var transactionData = new Dictionary<string, AttributeValue>
{
{ "Id1", new AttributeValue { N = transacionDataModel.IdOne.ToString() } },
{ "Id2", new AttributeValue { S = transacionDataModel.IdTwo } },
{ "Price", new AttributeValue { N = transacionDataModel.Price.ToString() } },
{ "DataToCheckCondition", new AttributeValue { S = transacionDataModel.DataToCheck.ToString() } },
{ "Action", new AttributeValue { N = transacionDataModel.Action.ToString() } },
{ "Date", new AttributeValue { S = transacionDataModel.Date} }
};
await dynamoDbClient.UpdateItemAsync(new UpdateItemRequest
{
Key = new Dictionary<string, AttributeValue>()
{
{ "PartitionDate", new AttributeValue {
S = "20200821"
}
},
{ "SortedIDKey", new AttributeValue {
N = "1"
}
}
},
TableName = tableName,
//UpdateExpression = "SET DataToSave= list_append(DataToSave, :newData)",
//ConditionExpression = $"not contains(#DataToSave[0].#DataToCheckCondition, {transacionDataModel.Partida})",
//UpdateExpression = "SET DataToSave= list_append(if_not_exists(DataToSave, :newData), :newData)",
//ConditionExpression = $"not (contains(#DataToSave.#DataToCheckCondition, :localDataToCheck))",
UpdateExpression = "SET #DataToSave = list_append(#DataToSave, :newData)",
ConditionExpression = $"#DataToSave.#DataToCheckCondition <> :localDataToCheck",
ExpressionAttributeNames = new Dictionary<string, string>
{
{ "#DataToSave", "DataToSave" },
{ "#DataToCheckCondition", "DataToCheckCondition" }
},
ExpressionAttributeValues =
new Dictionary<string, AttributeValue>
{
{ ":newData",
new AttributeValue
{
L = new List<AttributeValue>
{
new AttributeValue()
{
M = transactionData
}
}
}
},
{
":localDataToCheck",
new AttributeValue
{
S = transacionDataModel.DataToCheck
}
}
}
});
}