[英]Filter expression based on a nested attribute in an array - DynamoDB
我有一個DynamoDB表,我存儲了這些數據;
其中“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)但是沒有用。 什么是正確的方法呢? 另外,我應該在表中為端點創建索引嗎?
謝謝你的幫助。 問候; 格斯
屬性data
是對象列表。 因此,如果您不提供list屬性的數組索引,DynamoDB將無法找到該項。 如果您知道endpoint
和value
的值,則可以使用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
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.