根据数组中的嵌套属性过滤表达式 - DynamoDB

时间:2017-08-25 03:59:13

标签: javascript amazon-dynamodb

我有一个DynamoDB表,我存储了这些数据;

JSON data

其中“device”是分区键,“datetime”是排序键。 我能够根据PartitionKey和日期范围(排序键)查询数据。但是现在,我需要根据“数据”里面的“端点”进行过滤,这是一个数组。例如,我想仅在端点1存在于数据阵列中时检索数据,或者例如,如果存在端点IN(1,3)。 我正在使用以下代码;

var dev = event.params.querystring.device;    
var from = event.params.querystring.from;
var to  = event.params.querystring.to;
var ascord = event.params.querystring.ascord;
var limit = event.params.querystring.limit;

  
var qryParams = {
  TableName : "mytable",
  KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2",
  FilterExpression: "data.endpoint = :ep",
  ExpressionAttributeNames:{
      "#id": "device",
      "#tm": "datetime"
  },
  ExpressionAttributeValues: {
      ":dddd": dev,
      ":time1": from, 
      ":time2": to, 
      ":ep": 1
  }
};

docClient.query(qryParams, function(err, data){
    if (err){
        callback(err, null);
    }else {
        callback(null, data);
    }
})

但它没有检索任何记录。我也试过使用占位符(#data。#endpoint)但是没有用。 什么是正确的方法呢? 另外,我应该在表中为端点创建索引吗?

感谢您的帮助。 问候; 格斯

1 个答案:

答案 0 :(得分:1)

属性data是一个对象列表。因此,如果您不提供list属性的数组索引,DynamoDB将无法找到该项。如果您知道containsendpoint的值,则可以使用value功能。

选项1 - 使用包含: -

var params = {
    TableName: table,
    KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2",
    FilterExpression: "contains (#data, :ep)",
    ExpressionAttributeNames: {
        "#id": "deviceid",
        "#tm": "datetime",
        "#data" : "data"
    },
    ExpressionAttributeValues: {
        ":dddd": "1",
        ":time1": "2017-08-22T00:44:11:424Z",
        ":time2": "2017-08-22T23:44:11:424Z",
        ":ep": {
            "endpoint": 1,
            "value": "23"
        }
    }
};

选项2 - 使用索引: -

var params = {
    TableName: table,
    KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2",
    FilterExpression: "#data"+"[0].endpoint = :ep",
    ExpressionAttributeNames: {
        "#id": "deviceid",
        "#tm": "datetime",
        "#data" : "data"
    },
    ExpressionAttributeValues: {
        ":dddd": "1",
        ":time1": "2017-08-22T00:44:11:424Z",
        ":time2": "2017-08-22T23:44:11:424Z",
        ":ep": 1
    }
};