Amazon web services 更新dynamodb中的列表项
我在AWS DynamoDB中的数据结构如下所示:Amazon web services 更新dynamodb中的列表项,amazon-web-services,aws-lambda,amazon-dynamodb,dynamodb-queries,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Dynamodb Queries,我在AWS DynamoDB中的数据结构如下所示: { key: 'roomNameOne', value: { attendees: ['A', 'B', 'C'] // this is a set, wsConnections: [{ connectiondId: 'foo', domain: 'xyz.com' }, { connectiondId: 'bar', domain: 'xyz.com' }] } } { key: 'roomNameOne',
{ key: 'roomNameOne',
value: {
attendees: ['A', 'B', 'C'] // this is a set,
wsConnections: [{ connectiondId: 'foo', domain: 'xyz.com' }, { connectiondId: 'bar', domain: 'xyz.com' }]
}
}
{ key: 'roomNameOne',
value: {
attendees: ['A', 'B', 'C'] // this is a set,
wsConnections: [{ connectiondId: 'bar', domain: 'xyz.com' }]
}
}
现在,当我收到一个connectionId:foo丢失的请求时,我想从所有项目中删除该条目
因此,在DynamoDB更新操作之后,我的列表应该如下所示:
{ key: 'roomNameOne',
value: {
attendees: ['A', 'B', 'C'] // this is a set,
wsConnections: [{ connectiondId: 'foo', domain: 'xyz.com' }, { connectiondId: 'bar', domain: 'xyz.com' }]
}
}
{ key: 'roomNameOne',
value: {
attendees: ['A', 'B', 'C'] // this is a set,
wsConnections: [{ connectiondId: 'bar', domain: 'xyz.com' }]
}
}
你能帮我查询一下更新吗?这里的诀窍是我不知道房间名称,但在连接时,我知道连接感兴趣的所有房间名称。不幸的是,DynamoDB不允许对复杂属性(例如地图列表)执行此类操作 使用复杂属性建模一对多关系是一种有用的模式。然而,这种方法的缺点之一是,您将无法执行所描述的操作类型
如果您有访问模式,要求您更新<代码> WSsRess/Cuff>,您可以考虑通过使<代码> WSCONSITS/<代码>中的每个条目在DYNODB中列出自己的项目来对关系进行建模。比如说
以这种方式存储数据将使您更容易删除连接。例如,如果要从连接中删除条
,可以执行以下操作
ddbClient.delete({
TableName: "YOUR_TABLE_NAME",
Key: {PK: "roomNameOne", SK: "wsConnection#bar"}
})
编辑:如果您没有访问PK的权限,您唯一的选择就是执行扫描
操作
ddbClient.scan({
"TableName": "YOUR TABLE NAME",
"FilterExpression": "contains(#key, :value)",
"ExpressionAttributeValues": {
":value": {
"S": "foo"
}
},
"ExpressionAttributeNames": {
"#key": "connections"
}
})
这将scan
整个数据库,查找connections
属性包含“foo”的项目。这将允许您获取项目列表,然后可以更新并保存回DDB
这种方法并不理想。scan
操作将搜索整个数据库,效率极低。您还必须向DDB发出多个请求;一个用于获取,一个用于更新。多次往返并不是世界末日,但同样也不理想
要解锁更灵活、更高效的访问模式,最好从
wsConnections
list属性中获取数据。只要数据隐藏在一个复杂的属性中,您的选择就会受到限制。谢谢您的回复,但是当wsConnection丢失时,我就不知道PK了。我明白了。我在答案中加入了我的想法。一个指向连接atributte的新的全局二级索引(使用Seth建模建议)将是一个解决方案,对吗?因为这样会取消扫描。@Henrique Fernando是的,二级索引也可以。但是,不能对复杂属性中的值定义二级索引。