过滤 AWS DynamoDB 中的映射对象

Posted

技术标签:

【中文标题】过滤 AWS DynamoDB 中的映射对象【英文标题】:Filtering a Mapped object in AWS DynamoDB 【发布时间】:2018-07-18 18:20:43 【问题描述】:

我有两个当前的表

用户表:

| user_id (主键) |该用户拥有的设备地图 |

事件表:

| id_device(主键) |时间戳(排序键)|数据栏 |绑定到此设备的用户地图,例如 [ user_id: "A", user_id: "B" ] |

user_id:1 可以有多个设备,例如 1,2,3,4 user_id:2 也可以修改相同的设备并拥有不同的设备,例如 2,3,4,5

事件表实际上是网络上任何设备生成的最新事件,随着事件的发生,表会变大。

我希望能够通过用户查询设备的最新事件。

方法一:我原本打算使用 dynamoDB API (BatchGetItem) 并将设备映射作为键传递。但是,我不能这样做,因为我需要提供时间戳。

有没有办法扫描/查询“绑定到此设备的用户地图”列,例如仅过滤地图中的“A”用户?我知道不推荐扫描

方法2:只有id_device的二级索引作为主键。查询每个是否最新事件并进入“绑定到此设备的用户地图”地图以查看所有者是否在那里。如果是这样,则追加到要返回的空数组。

还有其他人有什么建议吗?谢谢!

【问题讨论】:

【参考方案1】:

看看可用的ComparisonOperators

不用复制整个页面,你可以使用这些比较运算符

情商 |东北部 |乐 | LT |通用电气 |燃气轮机 | NOT_NULL |空 |包含 | NOT_CONTAINS | BEGINS_WITH |输入 |之间

特别是你可能会想要

包含

检查子序列或集合中的值。 AttributeValueList 只能包含一个 AttributeValue 类型的元素 字符串、数字或二进制(不是集合类型)。如果目标属性为 比较是字符串类型,然后操作员检查一个 子串匹配。如果比较的目标属性是类型 二进制,然后运算符查找目标的子序列 匹配输入。如果比较的目标属性是一个集合 (“SS”、“NS”或“BS”),则如果找到,则运算符评估为真 与集合的任何成员完全匹配。包含支持 列表:评估“a CONTAINS b”时,“a”可以是列表;但是,“b” 不能是集合、地图或列表。

例如,给定一个设备 ID,您可以像这样找到所有关联的用户:

var AWS = require('aws-sdk');
// Set the region 
AWS.config.update(region: 'REGION');

// Create DynamoDB service object
var ddb = new AWS.DynamoDB(apiVersion: '2012-08-10');

var params = 
 ExpressionAttributeValues: 
  ":device_id": 
    S: "A"
   
 ,
 FilterExpression: "contains (DeviceMapAttributeName, :device_id)",
 ProjectionExpression: "user_id",
 TableName: "USER_TABLE"
;

ddb.scan(params, function(err, data) 
  if (err) 
    console.log("Error", err);
   else 
    data.Items.forEach(function(element, index, array) 
      console.log(element.user_id);
    );
  
);

如您所见,这是一次扫描。在这种情况下,您不能使用查询。

【讨论】:

以上是关于过滤 AWS DynamoDB 中的映射对象的主要内容,如果未能解决你的问题,请参考以下文章

Aws Dynamodb数据导出到S3

如何授予对 DynamoDB 表的访问权限?

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询

AWS dynamoDB:在过滤器之前或之后计算/应用的读取容量?

AWS AppSync:如何通过 DynamoDB 返回有效的 JSON

如何检查然后更新node.js中的AWS dynamoDB项?