我有一个dynamodb表,它的一个属性包含一个嵌套的映射,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,从而从该映射中生成一个项目。
如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“x1”(也可能是f3)?这应该只更新第一个列表元素位置属性。
{
"inventory": [
{
"location": "in place one", # I want to update this
"name": "opel",
"tags": [
"x1",
"f3"
]
},
{
"location": "in place two",
"name": "abc",
"tags": [
"a3",
"f5"
]
}],
"User" :"test"
}
您可以按照以下方式更新嵌套映射:
>
首先创建并清空map类型的item属性。在示例图中,为空项属性。
dynamoTable = dynamodb.Table('abc')
dynamoTable.put_item(
Item={
'email': email_add,
'graph': {},
}
更新嵌套映射,如下所示:
brand_name = 'opel'
DynamoTable = dynamodb.Table('abc')
dynamoTable.update_item(
Key={
'email': email_add,
},
UpdateExpression="set #Graph.#brand= :name, ",
ExpressionAttributeNames={
'#Graph': 'inventory',
'#brand': str(brand_name),
},
ExpressionAttributeValues = {
':name': {
"location": "in place two",
'tag': {
'graph_type':'a3',
'graph_title': 'f5'
}
}
更新迈克的答案,因为这种方式不再有效(至少对我来说)。
它现在是这样工作的(请注意UpdateExpression
和ExpressionAttributeNames
):
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET inv.#brand.loc = :locVal",
ExpressionAttributeNames={
'#brand': 'opel'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
无论在Key={}
中出现什么,它总是分区键(和排序键,如果有的话)。
编辑:似乎这种方式只适用于具有两级嵌套属性的情况。在本例中,您将仅对“中间”属性使用“ExpressionAttributeNames”(在本例中,这将是#brand
:inv.#brand.loc
)。我现在还不确定真正的规则是什么。
更新的答案-基于更新的问题陈述
您可以使用更新表达式更新嵌套映射中的属性,这样只有项目的一部分会得到更新(即。DynamoDB将对您的项目应用相当于补丁),但是,由于DynamoDB是一个文档数据库,所有操作(放置、获取、更新、删除等)都将对项目作为一个整体进行。
因此,在您的示例中,假设User
是分区键,并且没有排序键(在该示例中,我没有看到任何可能是排序键的属性),更新请求可能如下所示:
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET #inv[0].#loc = :locVal",
ExpressionAttributeNames={
'#inv': 'inventory',
'#loc': 'location'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
也就是说,您必须知道项目模式是什么样子,以及项目中哪些属性应该准确更新。
DynamoDB没有办法对子项进行操作。也就是说,没有办法告诉Dynamo执行诸如“更新项目,设置‘库存’数组中具有‘名称’等于‘欧宝’属性的元素的‘位置’属性”之类的操作
这可能不是您所希望的答案,但它是今天可用的。您可以通过稍微改变模式来更接近您想要的。
如果需要按名称引用子项,可能需要存储以下内容:
{
"inventory": {
"opel": {
"location": "in place one", # I want to update this
"tags": [ "x1", "f3" ]
},
"abc": {
"location": "in place two",
"tags": [ "a3", "f5" ]
}
},
"User" :"test"
}
那么你的问题是:
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET #inv.#brand.#loc = :locVal",
ExpressionAttributeNames={
'#inv': 'inventory',
'#loc': 'location',
'#brand': 'opel'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
但是YMMV,即使这样也有局限性,因为您仅限于按名称识别库存项目(即,您仍然不能说“使用标记'x1'更新库存”
最终,你应该仔细考虑为什么你需要Dynamo来为你执行这些复杂的操作,而不是具体说明你想要更新什么。
我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)
我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->
我用下面的方法尝试了嵌套映射。 我在声明“root_cause”时出错:[{“type”:“mapper_parsing_exception”,“reason”:“root映射定义有不支持的参数:[type:nested]。” 感谢您的帮助。
我有一个方法可以返回相当嵌套的JSON,比如: 当我尝试使用< code>JsonSlurper将这个JSON slurp到< code>def result中时,我得到了异常: 当<code>parseText</code>执行时产生引发的异常: 有什么办法吗?
有人能帮忙填写上面的评论部分吗?或者是否有其他选项来映射这些对象? 编辑:我尝试了下面的解决方案,但是接口实现类本身发生了变化。
我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...