我有两个当前的表
用户表:
| user_id(主键)|此用户拥有的设备地图|
事件表:
| id_device(主键)| time_stamp(排序键)|数据列|绑定到此设备的用户地图,例如[{user_id:" A"},{user_id:" B"}] |
user_id:1可以有多个设备,例如1,2,3,4 user_id:2也可以修改相同的设备并具有不同的设备,例如2,3,4,5
事件表实际上是网络上任何设备发生的最新事件,表随着事件的发生而变大。
我希望能够由用户查询设备的最新事件。
方法1:我原本打算使用dynamoDB API(BatchGetItem)并将设备地图作为键传递。但是,我不能这样做,因为我需要提供time_stamps。
有没有办法扫描/查询与此设备相关联的用户地图"列仅用于过滤" A"用户在地图中?我知道扫描不推荐
方法2:只有id_device的二级索引作为主键。查询每个最新事件,并进入与此设备相关联的用户地图"映射以查看所有者是否在那里。如果是,则附加到要返回的空数组。
还有其他人有什么建议吗?谢谢!
答案 0 :(得分:1)
查看可用的ComparisonOperators
不复制整个页面,您可以使用这些比较运算符
情商| NE | LE | LT | GE | GT | NOT_NULL | NULL |包含| NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN
具体而言,你可能想要
包含:
检查子序列或集合中的值。 AttributeValueList只能包含一个类型的AttributeValue元素 字符串,数字或二进制(不是集类型)。如果是目标属性 比较是String类型,然后运算符检查a 子串匹配。如果比较的目标属性是类型 二进制,然后运算符查找目标的子序列 匹配输入。如果比较的目标属性是一个集合 (“SS”,“NS”或“BS”),如果找到,则运算符求值为true 与该组的任何成员完全匹配。支持CONTAINS 列表:在评估“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);
});
}
});
正如您所看到的,这是一次扫描。在这种情况下,您无法使用查询。