首页 文章

过滤AWS DynamoDB中的映射对象

提问于
浏览
1

我有两个当前的表

用户表:

| user_id(主键)|此用户拥有的设备的 Map |

事件表:

| id_device(主键)| time_stamp(排序键)|数据列|绑定到此设备的用户 Map ,例如[{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 .

Is there a way to scan/query the "map of users tied to this device" column such as only filtering for the "A" user in the map? I know scanning not recommended

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

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

1 回答

  • 1

    看看可用的ComparisonOperators

    无需复制整个页面,您可以使用这些比较运算符

    EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL |包含| NOT_CONTAINS | BEGINS_WITH | IN |之间

    特别是你可能想要的

    CONTAINS:检查子序列或集合中的值 . AttributeValueList只能包含一个String,Number或Binary类型的AttributeValue元素(不是set类型) . 如果比较的目标属性是String类型,则运算符检查子字符串匹配 . 如果比较的目标属性是Binary类型,则运算符将查找与输入匹配的目标的子序列 . 如果比较的目标属性是一个集合(“SS”,“NS”或“BS”),那么如果运算符找到与集合中任何成员的完全匹配,则运算符的计算结果为true . 列表支持CONTAINS:在评估“a CONTAINS b”时,“a”可以是列表;但是,“b”不能是集合, Map 或列表 .

    例如,给定设备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);
        });
      }
    });
    

    如您所见,这是一次扫描 . 在这种情况下,您无法使用查询 .

相关问题