过滤AWS DynamoDB中的映射对象

时间:2018-02-08 08:44:32

标签: amazon-web-services amazon-dynamodb aws-sdk aws-api-gateway

我有两个当前的表

用户表:

| 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的二级索引作为主键。查询每个最新事件,并进入与此设备相关联的用户地图"映射以查看所有者是否在那里。如果是,则附加到要返回的空数组。

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

1 个答案:

答案 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);
    });
  }
});

正如您所看到的,这是一次扫描。在这种情况下,您无法使用查询。