Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 更新dynamodb中的列表项_Amazon Web Services_Aws Lambda_Amazon Dynamodb_Dynamodb Queries - Fatal编程技术网

Amazon web services 更新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',

我在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', 
  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是的,二级索引也可以。但是,不能对复杂属性中的值定义二级索引。