过滤 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 Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询
AWS dynamoDB:在过滤器之前或之后计算/应用的读取容量?