2017-08-25 81 views
0

我有一個DynamoDB表,我存儲這些數據;基於數組中的嵌套屬性過濾表達式 - DynamoDB

JSON data

其中「裝置」是分區鍵和「日期時間」的排序鍵。 我可以根據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),但沒有奏效。 什麼是正確的方法來做到這一點? 另外,我應該在表中爲端點創建一個索引嗎?

感謝您的幫助。 關心; Gus

回答

0

屬性data是一個對象列表。因此,如果您未提供list屬性的數組索引,那麼DynamoDB無法找到該項目。如果您知道endpointvalue的值,則可以使用contains函數。

選項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 
    } 
};