Gus*_*ina 5 javascript amazon-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);
}
})
Run Code Online (Sandbox Code Playgroud)
但它不会检索任何记录。我还尝试使用占位符(#data.#endpoint),但没有成功。正确的做法是什么?另外,我应该在表中为端点创建索引吗?
感谢您的帮助。问候; 格斯
该属性data
是对象的列表。因此,如果您不提供列表属性的数组索引,DynamoDB 将无法找到该项目。如果您知道和contains
的值,则可以使用函数。endpoint
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"
}
}
};
Run Code Online (Sandbox Code Playgroud)
选项 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
}
};
Run Code Online (Sandbox Code Playgroud)