Amazon web services 在AWS DynamoDB中过滤映射对象

Amazon web services 在AWS DynamoDB中过滤映射对象,amazon-web-services,amazon-dynamodb,aws-sdk,aws-api-gateway,Amazon Web Services,Amazon Dynamodb,Aws Sdk,Aws Api Gateway,我现在有两张桌子 用户表: |用户id(主键)|此用户拥有的设备地图| 事件表: |id_设备(主键)|时间戳(排序键)|数据列|绑定到此设备的用户地图,例如[{user_id:“A”},{user_id:“B”}]| 用户id:1可能有多个设备,例如1、2、3、4 用户id:2还可以修改相同的设备,并具有不同的设备,例如2,3,4,5 事件表实际上是网络上任何设备生成的最新事件,随着事件的发生,该表会变大 我希望能够通过用户查询设备的最新事件 方法1:我最初打算使用dynamoDB API(B

我现在有两张桌子

用户表:

|用户id(主键)|此用户拥有的设备地图|

事件表:

|id_设备(主键)|时间戳(排序键)|数据列|绑定到此设备的用户地图,例如[{user_id:“A”},{user_id:“B”}]|

用户id:1可能有多个设备,例如1、2、3、4 用户id:2还可以修改相同的设备,并具有不同的设备,例如2,3,4,5

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

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

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

是否有办法扫描/查询“绑定到此设备的用户地图”列,例如仅过滤地图中的“a”用户?我知道不建议扫描

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


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

查看可用的

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

等式| NE | LE | LT | GE | GT | NOT | NULL | NULL |包含| NOT|U包含|以|中间|开头|

特别是你可能会想要

包含

检查子序列或集合中的值。 AttributeValue列表只能包含一个类型为的AttributeValue元素 字符串、数字或二进制(不是集合类型)。如果 比较类型为String,然后运算符检查 子串匹配。如果比较的目标属性的类型为 二进制,然后运算符查找 匹配输入。如果比较的目标属性是集合 (“SS”、“NS”或“BS”),如果发现 与集合中的任何成员完全匹配。支持包含 列表:当评估“a包含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);
    });
  }
});
正如你所看到的,这是一个扫描。在这种情况下不能使用查询